dlm: handle port as __be16 network byte order

This patch handles the DLM listen port setting internally as byte order
as it is a value that is used as network byte on the wire. The user
space still sets this value as host byte order for configfs as we don't
break UAPI here.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
Alexander Aring 2024-10-04 11:13:40 -04:00 committed by David Teigland
parent 7138c79034
commit f92a5be571
3 changed files with 46 additions and 19 deletions

View File

@ -73,7 +73,7 @@ const struct rhashtable_params dlm_rhash_rsb_params = {
struct dlm_cluster {
struct config_group group;
unsigned int cl_tcp_port;
__be16 cl_tcp_port;
unsigned int cl_buffer_size;
unsigned int cl_rsbtbl_size;
unsigned int cl_recover_timer;
@ -132,6 +132,45 @@ static ssize_t cluster_cluster_name_store(struct config_item *item,
CONFIGFS_ATTR(cluster_, cluster_name);
static ssize_t cluster_tcp_port_show(struct config_item *item, char *buf)
{
return sprintf(buf, "%u\n", be16_to_cpu(dlm_config.ci_tcp_port));
}
static int dlm_check_zero_and_dlm_running(unsigned int x)
{
if (!x)
return -EINVAL;
if (dlm_lowcomms_is_running())
return -EBUSY;
return 0;
}
static ssize_t cluster_tcp_port_store(struct config_item *item,
const char *buf, size_t len)
{
int rc;
u16 x;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
rc = kstrtou16(buf, 0, &x);
if (rc)
return rc;
rc = dlm_check_zero_and_dlm_running(x);
if (rc)
return rc;
dlm_config.ci_tcp_port = cpu_to_be16(x);
return len;
}
CONFIGFS_ATTR(cluster_, tcp_port);
static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
int *info_field, int (*check_cb)(unsigned int x),
const char *buf, size_t len)
@ -191,17 +230,6 @@ static int dlm_check_protocol_and_dlm_running(unsigned int x)
return 0;
}
static int dlm_check_zero_and_dlm_running(unsigned int x)
{
if (!x)
return -EINVAL;
if (dlm_lowcomms_is_running())
return -EBUSY;
return 0;
}
static int dlm_check_zero(unsigned int x)
{
if (!x)
@ -218,7 +246,6 @@ static int dlm_check_buffer_size(unsigned int x)
return 0;
}
CLUSTER_ATTR(tcp_port, dlm_check_zero_and_dlm_running);
CLUSTER_ATTR(buffer_size, dlm_check_buffer_size);
CLUSTER_ATTR(rsbtbl_size, dlm_check_zero);
CLUSTER_ATTR(recover_timer, dlm_check_zero);
@ -982,7 +1009,7 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
#define DEFAULT_CLUSTER_NAME ""
struct dlm_config_info dlm_config = {
.ci_tcp_port = DEFAULT_TCP_PORT,
.ci_tcp_port = cpu_to_be16(DEFAULT_TCP_PORT),
.ci_buffer_size = DLM_MAX_SOCKET_BUFSIZE,
.ci_rsbtbl_size = DEFAULT_RSBTBL_SIZE,
.ci_recover_timer = DEFAULT_RECOVER_TIMER,

View File

@ -29,7 +29,7 @@ extern const struct rhashtable_params dlm_rhash_rsb_params;
#define DLM_PROTO_SCTP 1
struct dlm_config_info {
int ci_tcp_port;
__be16 ci_tcp_port;
int ci_buffer_size;
int ci_rsbtbl_size;
int ci_recover_timer;

View File

@ -660,18 +660,18 @@ static void add_sock(struct socket *sock, struct connection *con)
/* Add the port number to an IPv6 or 4 sockaddr and return the address
length */
static void make_sockaddr(struct sockaddr_storage *saddr, uint16_t port,
static void make_sockaddr(struct sockaddr_storage *saddr, __be16 port,
int *addr_len)
{
saddr->ss_family = dlm_local_addr[0].ss_family;
if (saddr->ss_family == AF_INET) {
struct sockaddr_in *in4_addr = (struct sockaddr_in *)saddr;
in4_addr->sin_port = cpu_to_be16(port);
in4_addr->sin_port = port;
*addr_len = sizeof(struct sockaddr_in);
memset(&in4_addr->sin_zero, 0, sizeof(in4_addr->sin_zero));
} else {
struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)saddr;
in6_addr->sin6_port = cpu_to_be16(port);
in6_addr->sin6_port = port;
*addr_len = sizeof(struct sockaddr_in6);
}
memset((char *)saddr + *addr_len, 0, sizeof(struct sockaddr_storage) - *addr_len);
@ -1121,7 +1121,7 @@ static void writequeue_entry_complete(struct writequeue_entry *e, int completed)
/*
* sctp_bind_addrs - bind a SCTP socket to all our addresses
*/
static int sctp_bind_addrs(struct socket *sock, uint16_t port)
static int sctp_bind_addrs(struct socket *sock, __be16 port)
{
struct sockaddr_storage localaddr;
struct sockaddr *addr = (struct sockaddr *)&localaddr;