|
@@ -28,6 +28,10 @@ static const struct stp_proto br_stp_proto = {
|
|
|
.rcv = br_stp_rcv,
|
|
|
};
|
|
|
|
|
|
+static struct pernet_operations br_net_ops = {
|
|
|
+ .exit = br_net_exit,
|
|
|
+};
|
|
|
+
|
|
|
static int __init br_init(void)
|
|
|
{
|
|
|
int err;
|
|
@@ -42,18 +46,22 @@ static int __init br_init(void)
|
|
|
if (err)
|
|
|
goto err_out;
|
|
|
|
|
|
- err = br_netfilter_init();
|
|
|
+ err = register_pernet_subsys(&br_net_ops);
|
|
|
if (err)
|
|
|
goto err_out1;
|
|
|
|
|
|
- err = register_netdevice_notifier(&br_device_notifier);
|
|
|
+ err = br_netfilter_init();
|
|
|
if (err)
|
|
|
goto err_out2;
|
|
|
|
|
|
- err = br_netlink_init();
|
|
|
+ err = register_netdevice_notifier(&br_device_notifier);
|
|
|
if (err)
|
|
|
goto err_out3;
|
|
|
|
|
|
+ err = br_netlink_init();
|
|
|
+ if (err)
|
|
|
+ goto err_out4;
|
|
|
+
|
|
|
brioctl_set(br_ioctl_deviceless_stub);
|
|
|
br_handle_frame_hook = br_handle_frame;
|
|
|
|
|
@@ -61,10 +69,12 @@ static int __init br_init(void)
|
|
|
br_fdb_put_hook = br_fdb_put;
|
|
|
|
|
|
return 0;
|
|
|
-err_out3:
|
|
|
+err_out4:
|
|
|
unregister_netdevice_notifier(&br_device_notifier);
|
|
|
-err_out2:
|
|
|
+err_out3:
|
|
|
br_netfilter_fini();
|
|
|
+err_out2:
|
|
|
+ unregister_pernet_subsys(&br_net_ops);
|
|
|
err_out1:
|
|
|
br_fdb_fini();
|
|
|
err_out:
|
|
@@ -80,7 +90,7 @@ static void __exit br_deinit(void)
|
|
|
unregister_netdevice_notifier(&br_device_notifier);
|
|
|
brioctl_set(NULL);
|
|
|
|
|
|
- br_cleanup_bridges();
|
|
|
+ unregister_pernet_subsys(&br_net_ops);
|
|
|
|
|
|
synchronize_net();
|
|
|
|