aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2008-11-05 19:00:02 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-05 19:00:02 -0500
commitae33bc40c0d96d02f51a996482ea7e41c5152695 (patch)
treeab250ee1d4eac70ac77a4f40ed303373c41d9213 /drivers
parentd0c082cea6dfb9b674b4f6e1e84025662dbd24e8 (diff)
net: Guaranetee the proper ordering of the loopback device.
I was recently hunting a bug that occurred in network namespace cleanup. In looking at the code it became apparrent that we have and will continue to have cases where if we have anything going on in a network namespace there will be assumptions that the loopback device is present. Things like sending igmp unsubscribe messages when we bring down network devices invokes the routing code which assumes that at least the loopback driver is present. Therefore to avoid magic initcall ordering hackery that is hard to follow and hard to get right insert a call to register the loopback device directly from net_dev_init(). This guarantes that the loopback device is the first device registered and the last network device to go away. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/loopback.c13
1 files changed, 2 insertions, 11 deletions
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index 91d08585a6d8..c4516b580ba5 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -204,17 +204,8 @@ static __net_exit void loopback_net_exit(struct net *net)
204 unregister_netdev(dev); 204 unregister_netdev(dev);
205} 205}
206 206
207static struct pernet_operations __net_initdata loopback_net_ops = { 207/* Registered in net/core/dev.c */
208struct pernet_operations __net_initdata loopback_net_ops = {
208 .init = loopback_net_init, 209 .init = loopback_net_init,
209 .exit = loopback_net_exit, 210 .exit = loopback_net_exit,
210}; 211};
211
212static int __init loopback_init(void)
213{
214 return register_pernet_device(&loopback_net_ops);
215}
216
217/* Loopback is special. It should be initialized before any other network
218 * device and network subsystem.
219 */
220fs_initcall(loopback_init);