summarylogtreecommitdiffstats
path: root/0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch
diff options
context:
space:
mode:
authorMichael Lass2020-07-21 22:15:01 +0200
committerMichael Lass2020-07-21 22:15:01 +0200
commit5b5aa46d82852b3d6210d71f5b01d7407705940d (patch)
treeaf6a306ab213ffb4e99721ad5eeb2518b227a7d9 /0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch
parentb2005ecaebc9c2caf0009e3fb9c3a32df8da2c13 (diff)
downloadaur-5b5aa46d82852b3d6210d71f5b01d7407705940d.tar.gz
Prepare for Linux 5.8
Diffstat (limited to '0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch')
-rw-r--r--0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch159
1 files changed, 159 insertions, 0 deletions
diff --git a/0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch b/0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch
new file mode 100644
index 00000000000..07bd4a72b59
--- /dev/null
+++ b/0002-LINUX-5.8-Replace-kernel_setsockopt-with-new-funcs.patch
@@ -0,0 +1,159 @@
+From 858ce410250bae8c5043b8277aa3941dd528d577 Mon Sep 17 00:00:00 2001
+From: Cheyenne Wills <cwills@sinenomine.net>
+Date: Fri, 3 Jul 2020 10:33:51 -0600
+Subject: [PATCH 2/4] LINUX 5.8: Replace kernel_setsockopt with new funcs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Linux 5.8-rc1 commit 'net: remove kernel_setsockopt' (5a892ff2facb)
+retires the kernel_setsockopt function. In prior kernel commits new
+functions (ip_sock_set_*) were added to replace the specific functions
+performed by kernel_setsockopt.
+
+Define new config test 'HAVE_IP_SOCK_SET' if the 'ip_sock_set' functions
+are available. The config define 'HAVE_KERNEL_SETSOCKOPT' is no longer
+set in Linux 5.8.
+
+Create wrapper functions that replace the kernel_setsockopt calls with
+calls to the appropriate Linux kernel function(s) (depending on what
+functions the kernel supports).
+
+Remove the unused 'kernel_getsockopt' function (used for building with
+pre 2.6.19 kernels).
+
+For reference
+ Linux 2.6.19 introduced kernel_setsockopt
+ Linux 5.8 removed kernel_setsockopt and replaced the functionality
+ with a set of new functions (ip_sock_set_*)
+
+Reviewed-on: https://gerrit.openafs.org/14247
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
+(cherry picked from commit c48072b9800759ef1682b91ff1e962f6904a2594)
+
+Change-Id: I2724fad06b1882149d2066d13eced55eff5ee695
+Reviewed-on: https://gerrit.openafs.org/14267
+Tested-by: BuildBot <buildbot@rampaginggeek.com>
+Reviewed-by: Michael Laß <lass@mail.uni-paderborn.de>
+Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
+---
+ src/afs/LINUX/osi_compat.h | 43 +++++++++++++++++++++++++------------
+ src/cf/linux-kernel-func.m4 | 6 ++++++
+ src/rx/LINUX/rx_knet.c | 11 +++-------
+ 3 files changed, 38 insertions(+), 22 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h
+index 4999b89b9..620b3730c 100644
+--- a/src/afs/LINUX/osi_compat.h
++++ b/src/afs/LINUX/osi_compat.h
+@@ -314,9 +314,22 @@ zero_user_segment(struct page *pp, unsigned int from1, unsigned int to1)
+ }
+ #endif
+
+-#ifndef HAVE_LINUX_KERNEL_SETSOCKOPT
++#if defined(HAVE_LINUX_IP_SOCK_SET)
++# include <net/ip.h>
++/* ip_sock_set_* introduced in linux 5.8 */
++static inline void
++afs_linux_sock_set_mtu_discover(struct socket *sockp, int pmtu)
++{
++ ip_sock_set_mtu_discover(sockp->sk, pmtu);
++}
++static inline void
++afs_linux_sock_set_recverr(struct socket *sockp)
++{
++ ip_sock_set_recverr(sockp->sk);
++}
++#else
++# if !defined(HAVE_LINUX_KERNEL_SETSOCKOPT)
+ /* Available from 2.6.19 */
+-
+ static inline int
+ kernel_setsockopt(struct socket *sockp, int level, int name, char *val,
+ unsigned int len) {
+@@ -329,20 +342,22 @@ kernel_setsockopt(struct socket *sockp, int level, int name, char *val,
+
+ return ret;
+ }
++# endif /* !HAVE_LINUX_KERNEL_SETSOCKOPT */
+
+-static inline int
+-kernel_getsockopt(struct socket *sockp, int level, int name, char *val,
+- int *len) {
+- mm_segment_t old_fs = get_fs();
+- int ret;
+-
+- set_fs(get_ds());
+- ret = sockp->ops->getsockopt(sockp, level, name, val, len);
+- set_fs(old_fs);
+-
+- return ret;
++static inline void
++afs_linux_sock_set_mtu_discover(struct socket *sockp, int pmtu)
++{
++ kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
++ sizeof(pmtu));
+ }
+-#endif
++static inline void
++afs_linux_sock_set_recverr(struct socket *sockp)
++{
++ int recverr = 1;
++ kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&recverr,
++ sizeof(recverr));
++}
++#endif /* !HAVE_LINUX_IP_SOCK_SET */
+
+ #ifdef HAVE_TRY_TO_FREEZE
+ static inline int
+diff --git a/src/cf/linux-kernel-func.m4 b/src/cf/linux-kernel-func.m4
+index 07627db52..78ff48294 100644
+--- a/src/cf/linux-kernel-func.m4
++++ b/src/cf/linux-kernel-func.m4
+@@ -151,6 +151,12 @@ AC_CHECK_LINUX_FUNC([lru_cache_add_file],
+ [#include <linux/swap.h>],
+ [lru_cache_add_file(NULL);])
+
++dnl Linux 5.8 replaced kernel_setsockopt with helper functions
++dnl e.g. ip_sock_set_mtu_discover, ip_sock_set_recverr
++AC_CHECK_LINUX_FUNC([ip_sock_set],
++ [#include <net/ip.h>],
++ [ip_sock_set_mtu_discover(NULL, 0);])
++
+ dnl Consequences - things which get set as a result of the
+ dnl above tests
+ AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"],
+diff --git a/src/rx/LINUX/rx_knet.c b/src/rx/LINUX/rx_knet.c
+index 9fbb563f3..50607c8f5 100644
+--- a/src/rx/LINUX/rx_knet.c
++++ b/src/rx/LINUX/rx_knet.c
+@@ -34,7 +34,6 @@
+ #include <linux/errqueue.h>
+ #include <linux/icmp.h>
+ #endif
+-
+ #include "osi_compat.h"
+
+ /* rxk_NewSocket
+@@ -76,14 +75,10 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
+ return NULL;
+ }
+
+- kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
+- sizeof(pmtu));
++ afs_linux_sock_set_mtu_discover(sockp, pmtu);
++
+ #ifdef AFS_RXERRQ_ENV
+- {
+- int recverr = 1;
+- kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&recverr,
+- sizeof(recverr));
+- }
++ afs_linux_sock_set_recverr(sockp);
+ #endif
+ return (osi_socket *)sockp;
+ }
+--
+2.27.0
+