Revert "net: Guaranetee the proper ordering of the loopback device."
This reverts commit ae33bc40c0d96d02f51a996482ea7e41c5152695.
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index c4516b5..91d0858 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -204,8 +204,17 @@
unregister_netdev(dev);
}
-/* Registered in net/core/dev.c */
-struct pernet_operations __net_initdata loopback_net_ops = {
+static struct pernet_operations __net_initdata loopback_net_ops = {
.init = loopback_net_init,
.exit = loopback_net_exit,
};
+
+static int __init loopback_init(void)
+{
+ return register_pernet_device(&loopback_net_ops);
+}
+
+/* Loopback is special. It should be initialized before any other network
+ * device and network subsystem.
+ */
+fs_initcall(loopback_init);
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 12d7f44..f1b0dbe 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1766,7 +1766,6 @@
return 0;
}
-extern struct pernet_operations __net_initdata loopback_net_ops;
#endif /* __KERNEL__ */
#endif /* _LINUX_DEV_H */
diff --git a/net/core/dev.c b/net/core/dev.c
index e0dc67a..2306d56 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4909,18 +4909,6 @@
if (register_pernet_subsys(&netdev_net_ops))
goto out;
- /* The loopback device is special if any other network devices
- * is present in a network namespace the loopback device must
- * be present. Since we now dynamically allocate and free the
- * loopback device ensure this invariant is maintained by
- * keeping the loopback device as the first device on the
- * list of network devices. Ensuring the loopback devices
- * is the first device that appears and the last network device
- * that disappears.
- */
- if (register_pernet_device(&loopback_net_ops))
- goto out;
-
if (register_pernet_device(&default_device_ops))
goto out;