vxcan: Set VXCAN_INFO_PEER to vxcan_link_ops.peer_type.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 8 Nov 2024 00:48:20 +0000 (16:48 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 12 Nov 2024 01:26:52 +0000 (17:26 -0800)
For per-netns RTNL, we need to prefetch the peer device's netns.

Let's set rtnl_link_ops.peer_type and accordingly remove duplicated
validation in ->newlink().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20241108004823.29419-8-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/can/vxcan.c

index 9e1b7d41005f8de12854b865bbad34a20877cbc7..da7c72105fb6e6cfd6bfe8a335f92befb43d5987 100644 (file)
@@ -188,14 +188,10 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,
 
        /* register peer device */
        if (data && data[VXCAN_INFO_PEER]) {
-               struct nlattr *nla_peer;
+               struct nlattr *nla_peer = data[VXCAN_INFO_PEER];
 
-               nla_peer = data[VXCAN_INFO_PEER];
                ifmp = nla_data(nla_peer);
-               err = rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
-               if (err < 0)
-                       return err;
-
+               rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
                tbp = peer_tb;
        }
 
@@ -208,9 +204,6 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,
        }
 
        peer_net = rtnl_link_get_net(net, tbp);
-       if (IS_ERR(peer_net))
-               return PTR_ERR(peer_net);
-
        peer = rtnl_create_link(peer_net, ifname, name_assign_type,
                                &vxcan_link_ops, tbp, extack);
        if (IS_ERR(peer)) {
@@ -302,6 +295,7 @@ static struct rtnl_link_ops vxcan_link_ops = {
        .newlink        = vxcan_newlink,
        .dellink        = vxcan_dellink,
        .policy         = vxcan_policy,
+       .peer_type      = VXCAN_INFO_PEER,
        .maxtype        = VXCAN_INFO_MAX,
        .get_link_net   = vxcan_get_link_net,
 };