]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nexthop: Convert RTM_DELNEXTHOP to per-netns RTNL.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 19 Mar 2025 23:06:52 +0000 (16:06 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Mar 2025 14:32:00 +0000 (07:32 -0700)
In rtm_del_nexthop(), only nexthop_find_by_id() and remove_nexthop()
require RTNL as they touch net->nexthop.rb_root.

Let's move RTNL down as rtnl_net_lock() before nexthop_find_by_id().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250319230743.65267-8-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/nexthop.c

index 06d5467eadc1dbf6c63defb2c406c150a931ffd3..467151517023d39d6a5cb4d1ed290301ee42fcb8 100644 (file)
@@ -3314,13 +3314,17 @@ static int rtm_del_nexthop(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (err)
                return err;
 
+       rtnl_net_lock(net);
+
        nh = nexthop_find_by_id(net, id);
-       if (!nh)
-               return -ENOENT;
+       if (nh)
+               remove_nexthop(net, nh, &nlinfo);
+       else
+               err = -ENOENT;
 
-       remove_nexthop(net, nh, &nlinfo);
+       rtnl_net_unlock(net);
 
-       return 0;
+       return err;
 }
 
 /* rtnl */
@@ -4074,7 +4078,8 @@ static struct pernet_operations nexthop_net_ops = {
 static const struct rtnl_msg_handler nexthop_rtnl_msg_handlers[] __initconst = {
        {.msgtype = RTM_NEWNEXTHOP, .doit = rtm_new_nexthop,
         .flags = RTNL_FLAG_DOIT_PERNET},
-       {.msgtype = RTM_DELNEXTHOP, .doit = rtm_del_nexthop},
+       {.msgtype = RTM_DELNEXTHOP, .doit = rtm_del_nexthop,
+        .flags = RTNL_FLAG_DOIT_PERNET},
        {.msgtype = RTM_GETNEXTHOP, .doit = rtm_get_nexthop,
         .dumpit = rtm_dump_nexthop},
        {.msgtype = RTM_GETNEXTHOPBUCKET, .doit = rtm_get_nexthop_bucket,