From: James Simmons Date: Thu, 10 Jul 2014 21:43:59 +0000 (-0400) Subject: LU-5322 socklnd: handle sk_ready_data change in 3.15+ kernels X-Git-Tag: 2.6.51~94 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=8293925e6fe9aeaee3af26cc1780f8e0b9661d0f;hp=258cb49e87123ffdcab2701ce2441f530ea46c23 LU-5322 socklnd: handle sk_ready_data change in 3.15+ kernels Starting with 3.15 kernels the sk_ready_data method in struct sock only takes a single argument instead of two in earlier kernels. Support this change in newer kernels. Change-Id: Ifb740a931f454e806c74065c79ff912ed97e4e10 Signed-off-by: James Simmons Reviewed-on: http://review.whamcloud.com/11059 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Bob Glossman Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4 index 7d6c971..8d81e1c 100644 --- a/lnet/autoconf/lustre-lnet.m4 +++ b/lnet/autoconf/lustre-lnet.m4 @@ -551,6 +551,27 @@ EXTRA_KCFLAGS="$tmp_flags" ]) # LN_CONFIG_TCP_SENDPAGE # +# LN_CONFIG_SK_DATA_READY +# +# 2.6.36 tcp_sendpage() first parameter is 'struct sock' instead of 'struct socket'. +# +AC_DEFUN([LN_CONFIG_SK_DATA_READY], [ +tmp_flags="$EXTRA_KCFLAGS" +EXTRA_KCFLAGS="-Werror" +LB_CHECK_COMPILE([if 'sk_data_ready' takes only one argument], +sk_data_ready, [ + #include + #include +],[ + ((struct sock *)0)->sk_data_ready(NULL); +],[ + AC_DEFINE(HAVE_SK_DATA_READY_ONE_ARG, 1, + [sk_data_ready uses only one argument]) +]) +EXTRA_KCFLAGS="$tmp_flags" +]) # LN_CONFIG_SK_DATA_READY + +# # LN_PROG_LINUX # # LNet linux kernel checks @@ -569,6 +590,8 @@ LN_CONFIG_GNILND LN_CONFIG_MX # 2.6.36 LN_CONFIG_TCP_SENDPAGE +# 3.15 +LN_CONFIG_SK_DATA_READY ]) # LN_PROG_LINUX # diff --git a/lnet/klnds/socklnd/socklnd_lib-linux.c b/lnet/klnds/socklnd/socklnd_lib-linux.c index 33ad490..2815a36 100644 --- a/lnet/klnds/socklnd/socklnd_lib-linux.c +++ b/lnet/klnds/socklnd/socklnd_lib-linux.c @@ -959,25 +959,33 @@ extern void ksocknal_write_callback (ksock_conn_t *conn); * socket call back in Linux */ static void -ksocknal_data_ready (struct sock *sk, int n) +#ifdef HAVE_SK_DATA_READY_ONE_ARG +ksocknal_data_ready(struct sock *sk) +#else +ksocknal_data_ready(struct sock *sk, int n) +#endif { - ksock_conn_t *conn; - ENTRY; + ksock_conn_t *conn; + ENTRY; /* interleave correctly with closing sockets... */ LASSERT(!in_irq()); read_lock(&ksocknal_data.ksnd_global_lock); - conn = sk->sk_user_data; - if (conn == NULL) { /* raced with ksocknal_terminate_conn */ - LASSERT (sk->sk_data_ready != &ksocknal_data_ready); - sk->sk_data_ready (sk, n); - } else - ksocknal_read_callback(conn); + conn = sk->sk_user_data; + if (conn == NULL) { /* raced with ksocknal_terminate_conn */ + LASSERT(sk->sk_data_ready != &ksocknal_data_ready); +#ifdef HAVE_SK_DATA_READY_ONE_ARG + sk->sk_data_ready(sk); +#else + sk->sk_data_ready(sk, n); +#endif + } else + ksocknal_read_callback(conn); read_unlock(&ksocknal_data.ksnd_global_lock); - EXIT; + EXIT; } static void