rtnetlink: Return int from rtnl_af_register().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 16 Oct 2024 18:53:56 +0000 (11:53 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Oct 2024 09:02:05 +0000 (11:02 +0200)
The next patch will add init_srcu_struct() in rtnl_af_register(),
then we need to handle its error.

Let's add the error handling in advance to make the following
patch cleaner.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Matt Johnston <matt@codeconstruct.com.au>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/rtnetlink.h
net/bridge/br_netlink.c
net/core/rtnetlink.c
net/ipv4/devinet.c
net/ipv6/addrconf.c
net/mctp/device.c
net/mpls/af_mpls.c

index 1a6aa5c..969138a 100644 (file)
@@ -204,7 +204,7 @@ struct rtnl_af_ops {
        size_t                  (*get_stats_af_size)(const struct net_device *dev);
 };
 
-void rtnl_af_register(struct rtnl_af_ops *ops);
+int rtnl_af_register(struct rtnl_af_ops *ops);
 void rtnl_af_unregister(struct rtnl_af_ops *ops);
 
 struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]);
index 6b97ae4..3e0f472 100644 (file)
@@ -1924,7 +1924,9 @@ int __init br_netlink_init(void)
        if (err)
                goto out;
 
-       rtnl_af_register(&br_af_ops);
+       err = rtnl_af_register(&br_af_ops);
+       if (err)
+               goto out_vlan;
 
        err = rtnl_link_register(&br_link_ops);
        if (err)
@@ -1934,6 +1936,8 @@ int __init br_netlink_init(void)
 
 out_af:
        rtnl_af_unregister(&br_af_ops);
+out_vlan:
+       br_vlan_rtnl_uninit();
 out:
        return err;
 }
index 445e6ff..70b663a 100644 (file)
@@ -686,11 +686,13 @@ static const struct rtnl_af_ops *rtnl_af_lookup(const int family)
  *
  * Returns 0 on success or a negative error code.
  */
-void rtnl_af_register(struct rtnl_af_ops *ops)
+int rtnl_af_register(struct rtnl_af_ops *ops)
 {
        rtnl_lock();
        list_add_tail_rcu(&ops->list, &rtnl_af_ops);
        rtnl_unlock();
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(rtnl_af_register);
 
index ec29ead..0ff9c0a 100644 (file)
@@ -2827,7 +2827,8 @@ void __init devinet_init(void)
        register_pernet_subsys(&devinet_ops);
        register_netdevice_notifier(&ip_netdev_notifier);
 
-       rtnl_af_register(&inet_af_ops);
+       if (rtnl_af_register(&inet_af_ops))
+               panic("Unable to register inet_af_ops\n");
 
        rtnl_register_many(devinet_rtnl_msg_handlers);
 }
index ac8645a..d0a9971 100644 (file)
@@ -7468,7 +7468,9 @@ int __init addrconf_init(void)
 
        addrconf_verify(&init_net);
 
-       rtnl_af_register(&inet6_ops);
+       err = rtnl_af_register(&inet6_ops);
+       if (err)
+               goto erraf;
 
        err = rtnl_register_many(addrconf_rtnl_msg_handlers);
        if (err)
@@ -7482,6 +7484,7 @@ int __init addrconf_init(void)
 errout:
        rtnl_unregister_all(PF_INET6);
        rtnl_af_unregister(&inet6_ops);
+erraf:
        unregister_netdevice_notifier(&ipv6_dev_notf);
 errlo:
        destroy_workqueue(addrconf_wq);
index 85cc5f3..3d75b91 100644 (file)
@@ -535,14 +535,20 @@ int __init mctp_device_init(void)
        int err;
 
        register_netdevice_notifier(&mctp_dev_nb);
-       rtnl_af_register(&mctp_af_ops);
+
+       err = rtnl_af_register(&mctp_af_ops);
+       if (err)
+               goto err_notifier;
 
        err = rtnl_register_many(mctp_device_rtnl_msg_handlers);
-       if (err) {
-               rtnl_af_unregister(&mctp_af_ops);
-               unregister_netdevice_notifier(&mctp_dev_nb);
-       }
+       if (err)
+               goto err_af;
 
+       return 0;
+err_af:
+       rtnl_af_unregister(&mctp_af_ops);
+err_notifier:
+       unregister_netdevice_notifier(&mctp_dev_nb);
        return err;
 }
 
index a057384..1f63b32 100644 (file)
@@ -2753,7 +2753,9 @@ static int __init mpls_init(void)
 
        dev_add_pack(&mpls_packet_type);
 
-       rtnl_af_register(&mpls_af_ops);
+       err = rtnl_af_register(&mpls_af_ops);
+       if (err)
+               goto out_unregister_dev_type;
 
        err = rtnl_register_many(mpls_rtnl_msg_handlers);
        if (err)
@@ -2773,6 +2775,7 @@ out_unregister_rtnl:
        rtnl_unregister_many(mpls_rtnl_msg_handlers);
 out_unregister_rtnl_af:
        rtnl_af_unregister(&mpls_af_ops);
+out_unregister_dev_type:
        dev_remove_pack(&mpls_packet_type);
 out_unregister_pernet:
        unregister_pernet_subsys(&mpls_net_ops);