From: Li Dongyang Date: Tue, 11 Jun 2019 05:43:55 +0000 (-0700) Subject: LU-11838 lnet: getname dropping addrlen argument X-Git-Tag: 2.12.3-RC1~154 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=d5191a1466d1382f63a0e598a4a08a495552a588;p=fs%2Flustre-release.git LU-11838 lnet: getname dropping addrlen argument 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 Change-Id: I4ad5de4a22f3fb23c07a356650ea7925acf07eed Reviewed-by: Gu Zheng Reviewed-by: James Simmons Reviewed-on: https://review.whamcloud.com/35173 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index d4d632d..1e51ba0 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -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 +],[ + 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 # diff --git a/lnet/include/lnet/lib-lnet.h b/lnet/include/lnet/lib-lnet.h index cc77602..e591aa7 100644 --- a/lnet/include/lnet/lib-lnet.h +++ b/lnet/include/lnet/lib-lnet.h @@ -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) diff --git a/lnet/lnet/lib-socket.c b/lnet/lnet/lib-socket.c index 0a10a38..8afc4b5 100644 --- a/lnet/lnet/lib-socket.c +++ b/lnet/lnet/lib-socket.c @@ -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;