OSDN Git Service

ipv4: add ip_sock_set_freebind
authorChristoph Hellwig <hch@lst.de>
Thu, 28 May 2020 05:12:27 +0000 (07:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 28 May 2020 18:11:45 +0000 (11:11 -0700)
Add a helper to directly set the IP_FREEBIND sockopt from kernel space
without going through a fake uaccess.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/target/iscsi/iscsi_target_login.c
include/net/ip.h
net/ipv4/ip_sockglue.c

index b561b07..85748e3 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/sched/signal.h>
 #include <linux/idr.h>
 #include <linux/tcp.h>        /* TCP_NODELAY */
+#include <net/ip.h>
 #include <net/ipv6.h>         /* ipv6_addr_v4mapped() */
 #include <scsi/iscsi_proto.h>
 #include <target/target_core_base.h>
@@ -855,7 +856,7 @@ int iscsit_setup_np(
        struct sockaddr_storage *sockaddr)
 {
        struct socket *sock = NULL;
-       int backlog = ISCSIT_TCP_BACKLOG, ret, opt = 0, len;
+       int backlog = ISCSIT_TCP_BACKLOG, ret, len;
 
        switch (np->np_network_transport) {
        case ISCSI_TCP:
@@ -900,15 +901,7 @@ int iscsit_setup_np(
        if (np->np_network_transport == ISCSI_TCP)
                tcp_sock_set_nodelay(sock->sk);
        sock_set_reuseaddr(sock->sk);
-
-       opt = 1;
-       ret = kernel_setsockopt(sock, IPPROTO_IP, IP_FREEBIND,
-                       (char *)&opt, sizeof(opt));
-       if (ret < 0) {
-               pr_err("kernel_setsockopt() for IP_FREEBIND"
-                       " failed\n");
-               goto fail;
-       }
+       ip_sock_set_freebind(sock->sk);
 
        ret = kernel_bind(sock, (struct sockaddr *)&np->np_sockaddr, len);
        if (ret < 0) {
index 2fc52e2..5f5d822 100644 (file)
@@ -765,6 +765,7 @@ static inline bool inetdev_valid_mtu(unsigned int mtu)
        return likely(mtu >= IPV4_MIN_MTU);
 }
 
+void ip_sock_set_freebind(struct sock *sk);
 void ip_sock_set_tos(struct sock *sk, int val);
 
 #endif /* _IP_H */
index b43a29e..767838d 100644 (file)
@@ -581,6 +581,14 @@ void ip_sock_set_tos(struct sock *sk, int val)
 }
 EXPORT_SYMBOL(ip_sock_set_tos);
 
+void ip_sock_set_freebind(struct sock *sk)
+{
+       lock_sock(sk);
+       inet_sk(sk)->freebind = true;
+       release_sock(sk);
+}
+EXPORT_SYMBOL(ip_sock_set_freebind);
+
 /*
  *     Socket option code for IP. This is the end of the line after any
  *     TCP,UDP etc options on an IP socket.