Whamcloud - gitweb
LU-11838 lnet: getname dropping addrlen argument 73/35173/2
authorLi Dongyang <dongyangli@ddn.com>
Tue, 11 Jun 2019 05:43:55 +0000 (22:43 -0700)
committerOleg Drokin <green@whamcloud.com>
Thu, 27 Jun 2019 21:46:50 +0000 (21:46 +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

This patch is back-ported from the following one:
Lustre-commit: dbb81e826290b2db27e24a85869c9d0736726caa
Lustre-change: https://review.whamcloud.com/34672

Test-Parameters:trivial
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Change-Id: I4ad5de4a22f3fb23c07a356650ea7925acf07eed
Reviewed-by: Gu Zheng <gzheng@ddn.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/35173
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Yang Sheng <ys@whamcloud.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 d4d632d..1e51ba0 100644 (file)
@@ -743,6 +743,27 @@ EXTRA_KCFLAGS="$tmp_flags"
 ]) # 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
@@ -767,6 +788,8 @@ LN_CONFIG_SK_DATA_READY
 LN_CONFIG_SOCK_CREATE_KERN
 # 4.11
 LN_CONFIG_SOCK_ACCEPT
+# 4.17
+LN_CONFIG_SOCK_GETNAME
 ]) # LN_PROG_LINUX
 
 #
index cc77602..e591aa7 100644 (file)
@@ -77,6 +77,18 @@ extern struct lnet the_lnet;                 /* THE network */
 #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)
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;
-       int                len = sizeof(sin);
-       int                rc;
+       int rc;
+#ifndef HAVE_KERN_SOCK_GETNAME_2ARGS
+       int len = sizeof(sin);
+#endif
 
        if (remote)
-               rc = kernel_getpeername(sock, (struct sockaddr *)&sin, &len);
+               rc = lnet_kernel_getpeername(sock,
+                                            (struct sockaddr *)&sin, &len);
        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;