inet: lockless getsockopt(IP_MTU)
authorEric Dumazet <edumazet@google.com>
Fri, 22 Sep 2023 03:42:18 +0000 (03:42 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Oct 2023 18:39:19 +0000 (19:39 +0100)
sk_dst_get() does not require socket lock.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ip_sockglue.c

index 45d89487914a12061f05c192004ad79f0abbf756..04579e390ddd4dadb8a107ef0b5da15e7a60f1ff 100644 (file)
@@ -1620,13 +1620,6 @@ int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        return -EFAULT;
                return 0;
        }
-       }
-
-       if (needs_rtnl)
-               rtnl_lock();
-       sockopt_lock_sock(sk);
-
-       switch (optname) {
        case IP_MTU:
        {
                struct dst_entry *dst;
@@ -1636,12 +1629,17 @@ int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        val = dst_mtu(dst);
                        dst_release(dst);
                }
-               if (!val) {
-                       sockopt_release_sock(sk);
+               if (!val)
                        return -ENOTCONN;
-               }
-               break;
+               goto copyval;
+       }
        }
+
+       if (needs_rtnl)
+               rtnl_lock();
+       sockopt_lock_sock(sk);
+
+       switch (optname) {
        case IP_UNICAST_IF:
                val = (__force int)htonl((__u32) inet->uc_index);
                break;