From: Mr NeilBrown <neilb@xxxxxxx> 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@xxxxxxx> Reviewed-on: https://review.whamcloud.com/43559 Reviewed-by: James Simmons <jsimmons@xxxxxxxxxxxxx> Reviewed-by: Arshad Hussain <arshad.hussain@xxxxxxxxxxxxxxxxx> Reviewed-by: Chris Horn <chris.horn@xxxxxxx> Reviewed-by: Oleg Drokin <green@xxxxxxxxxxxxx> Signed-off-by: James Simmons <jsimmons@xxxxxxxxxxxxx> --- net/lnet/lnet/lib-socket.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) 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, -- 1.8.3.1