diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2008-11-05 19:00:02 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-11-05 19:00:02 -0500 |
commit | ae33bc40c0d96d02f51a996482ea7e41c5152695 (patch) | |
tree | ab250ee1d4eac70ac77a4f40ed303373c41d9213 /drivers/net/loopback.c | |
parent | d0c082cea6dfb9b674b4f6e1e84025662dbd24e8 (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/net/loopback.c')
-rw-r--r-- | drivers/net/loopback.c | 13 |
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 | ||
207 | static struct pernet_operations __net_initdata loopback_net_ops = { | 207 | /* Registered in net/core/dev.c */ |
208 | struct 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 | |||
212 | static 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 | */ | ||
220 | fs_initcall(loopback_init); | ||