Whamcloud - gitweb
LU-11838 lnet: getname dropping addrlen argument 72/34672/4
authorLi Dongyang <dongyangli@ddn.com>
Mon, 15 Apr 2019 02:18:40 +0000 (12:18 +1000)
committerOleg Drokin <green@whamcloud.com>
Fri, 10 May 2019 07:12:25 +0000 (07:12 +0000)
Since kernel 4.17 ->getname() does not take int *addrlen
argument anymore, instead it's returning the length to
the caller.

Linux-commit: 9b2c45d479d0fb8647c9e83359df69162b5fbe5f

Test-Parameters:trivial
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Change-Id: I4ad5de4a22f3fb23c07a356650ea7925acf07eed
Reviewed-on: https://review.whamcloud.com/34672
Tested-by: Jenkins
Reviewed-by: Gu Zheng <gzheng@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lnet/autoconf/lustre-lnet.m4
lnet/include/lnet/lib-lnet.h
lnet/lnet/lib-socket.c

index 1a49733..effa0e1 100644 (file)
@@ -741,6 +741,27 @@ EXTRA_KCFLAGS="$tmp_flags"
 ]) # LN_CONFIG_SOCK_ACCEPT
 
 #
 ]) # LN_CONFIG_SOCK_ACCEPT
 
 #
+# LN_CONFIG_SOCK_GETNAME
+#
+# 4.17 commit 9b2c45d479d0fb8647c9e83359df69162b5fbe5f getname()
+# does not take the length *int argument and returns the length
+#
+AC_DEFUN([LN_CONFIG_SOCK_GETNAME], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'getname' has two args],
+kern_sock_getname_2args, [
+       #include <linux/net.h>
+],[
+       kernel_getsockname(NULL, NULL);
+],[
+       AC_DEFINE(HAVE_KERN_SOCK_GETNAME_2ARGS, 1,
+               ['getname' has two args])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LN_CONFIG_SOCK_GETNAME
+
+#
 # LN_PROG_LINUX
 #
 # LNet linux kernel checks
 # LN_PROG_LINUX
 #
 # LNet linux kernel checks
@@ -765,6 +786,8 @@ LN_CONFIG_SK_DATA_READY
 LN_CONFIG_SOCK_CREATE_KERN
 # 4.11
 LN_CONFIG_SOCK_ACCEPT
 LN_CONFIG_SOCK_CREATE_KERN
 # 4.11
 LN_CONFIG_SOCK_ACCEPT
+# 4.17
+LN_CONFIG_SOCK_GETNAME
 ]) # LN_PROG_LINUX
 
 #
 ]) # LN_PROG_LINUX
 
 #
index 473610c..a829103 100644 (file)
@@ -80,6 +80,18 @@ extern struct lnet the_lnet;                 /* THE network */
 #define DEFAULT_PEER_TIMEOUT    180
 #define LNET_LND_DEFAULT_TIMEOUT 5
 
 #define DEFAULT_PEER_TIMEOUT    180
 #define LNET_LND_DEFAULT_TIMEOUT 5
 
+#ifdef HAVE_KERN_SOCK_GETNAME_2ARGS
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+               kernel_getpeername(sock, addr)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+               kernel_getsockname(sock, addr)
+#else
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+               kernel_getpeername(sock, addr, addrlen)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+               kernel_getsockname(sock, addr, addrlen)
+#endif
+
 static inline int lnet_is_route_alive(struct lnet_route *route)
 {
        if (!route->lr_gateway->lpni_alive)
 static inline int lnet_is_route_alive(struct lnet_route *route)
 {
        if (!route->lr_gateway->lpni_alive)
index 0a10a38..8afc4b5 100644 (file)
@@ -453,14 +453,18 @@ int
 lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port)
 {
        struct sockaddr_in sin;
 lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port)
 {
        struct sockaddr_in sin;
-       int                len = sizeof(sin);
-       int                rc;
+       int rc;
+#ifndef HAVE_KERN_SOCK_GETNAME_2ARGS
+       int len = sizeof(sin);
+#endif
 
        if (remote)
 
        if (remote)
-               rc = kernel_getpeername(sock, (struct sockaddr *)&sin, &len);
+               rc = lnet_kernel_getpeername(sock,
+                                            (struct sockaddr *)&sin, &len);
        else
        else
-               rc = kernel_getsockname(sock, (struct sockaddr *)&sin, &len);
-       if (rc != 0) {
+               rc = lnet_kernel_getsockname(sock,
+                                            (struct sockaddr *)&sin, &len);
+       if (rc < 0) {
                CERROR("Error %d getting sock %s IP/port\n",
                        rc, remote ? "peer" : "local");
                return rc;
                CERROR("Error %d getting sock %s IP/port\n",
                        rc, remote ? "peer" : "local");
                return rc;