]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dlm: handle port as __be16 network byte order
authorAlexander Aring <aahringo@redhat.com>
Fri, 4 Oct 2024 15:13:40 +0000 (11:13 -0400)
committerDavid Teigland <teigland@redhat.com>
Fri, 4 Oct 2024 15:31:31 +0000 (10:31 -0500)
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>
fs/dlm/config.c
fs/dlm/config.h
fs/dlm/lowcomms.c

index 1980afaaa68cbc146f7cb44a7783ddad636f7d06..42dcf3f066680de03d43812ea8b7f0ee5ec0bb57 100644 (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,
index 8a14a6e954632aa8f5cbd26a4c8e38f3061b32c7..2c5dcf5eaef1e4e2f1fa6a713c89a4d965893d16 100644 (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;
index cb3a10b041c278fa36a1df82778df4fb87c8fb79..df40c3fd10702c825c4847552da43cad092e2210 100644 (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;