diff mbox series

[05/28] lnet: improve compat code for IPV6_V6ONLY sock opt

Message ID 1655560330-30743-6-git-send-email-jsimmons@infradead.org (mailing list archive)
State Not Applicable
Headers show
Series lustre: sync to OpenSFS June 15, 2022 | expand

Commit Message

James Simmons June 18, 2022, 1:51 p.m. UTC
From: Mr NeilBrown <neilb@suse.de>

Since linux 5.9 (v5.8-rc4-1952-ga7b75c5a8c41) it has been
possible to pass a "sockptr" to ->setsockopt() which can provide
a kernel address.

WC-bug-id: https://jira.whamcloud.com/browse/LU-14195
Lustre-commit: 6d111ff0dde182bfb ("LU-14195 lnet: improve compat code for IPV6_V6ONLY sock opt")
Signed-off-by: Mr NeilBrown <neilb@suse.de>
Reviewed-on: https://review.whamcloud.com/43559
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
 net/lnet/lnet/lib-socket.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/net/lnet/lnet/lib-socket.c b/net/lnet/lnet/lib-socket.c
index 7bb8d5c..3a99cb6 100644
--- a/net/lnet/lnet/lib-socket.c
+++ b/net/lnet/lnet/lib-socket.c
@@ -237,18 +237,12 @@  int choose_ipv4_src(u32 *ret, int interface, u32 dst_ipaddr, struct net *ns)
 			 * This is the default, but it can be overridden so we
 			 * force it back.
 			 */
-			/* From v5.7-rc6-2614-g5a892ff2facb when
-			 * kernel_setsockopt() was removed until
-			 * sockptr_t (above) there is no clean way to
-			 * pass kernel address to setsockopt.  We could
-			 * use get_fs()/set_fs(), but in this particular
-			 * situation there is an easier way.  It depends
-			 * on the fact that at least for these few
-			 * kernels a NULL address to ipv6_setsockopt()
-			 * is treated like the address of a zero.
+			/* sockptr_t was introduced around
+			 * v5.8-rc4-1952-ga7b75c5a8c41 and allows a
+			 * kernel address to be passed to ->setsockopt
 			 */
-			if (ipv6_only_sock(sock->sk) && !val) {
-				void *optval = NULL;
+			if (ipv6_only_sock(sock->sk)) {
+				sockptr_t optval = KERNEL_SOCKPTR(&val);
 
 				sock->ops->setsockopt(sock,
 						      IPPROTO_IPV6, IPV6_V6ONLY,