diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2007-11-14 15:53:16 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-11-14 15:53:16 -0800 |
commit | c67625a1ecd7caf4c0490fc5278d6bb736a5297f (patch) | |
tree | 18cfcdc01b8074b58c1da246ed437d550663f6bc /net/core | |
parent | 8a856397f1b023b53907d13e742c216d90dd5034 (diff) | |
download | linux-c67625a1ecd7caf4c0490fc5278d6bb736a5297f.tar.gz linux-c67625a1ecd7caf4c0490fc5278d6bb736a5297f.tar.bz2 linux-c67625a1ecd7caf4c0490fc5278d6bb736a5297f.zip |
[NET]: Remove notifier block from chain when register_netdevice_notifier fails
Commit fcc5a03ac42564e9e255c1134dda47442289e466:
[NET]: Allow netdev REGISTER/CHANGENAME events to fail
makes the register_netdevice_notifier() handle the error from the
NETDEV_REGISTER event, sent to the registering block.
The bad news is that in this case the notifier block is
not removed from the list, but the error is returned to the
caller. In case the caller is in module init function and
handles this error this can abort the module loading. The
notifier block will be then removed from the kernel, but
will be left in the list. Oops :(
I think that the notifier block should be removed from the
chain in case of error, regardless whether this error is
handled by the caller or not. In the worst case (the error
is _not_ handled) module will not receive the events any
longer.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/dev.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index dd40b35bb006..86d62611f2fc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1171,6 +1171,8 @@ rollback: nb->notifier_call(nb, NETDEV_UNREGISTER, dev); } } + + raw_notifier_chain_unregister(&netdev_chain, nb); goto unlock; } |