mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
[NET]: Allow netdev REGISTER/CHANGENAME events to fail
This patch adds code to allow errors to be passed up from event handlers of NETDEV_REGISTER and NETDEV_CHANGENAME. It also adds the notifier_from_errno/notifier_to_errnor helpers to pass the errno value up to the notifier caller. If an error is detected when a device is registered, it causes that operation to fail. A NETDEV_UNREGISTER will be sent to all event handlers. Similarly if NETDEV_CHANGENAME fails the original name is restored and a new NETDEV_CHANGENAME event is sent. As such all event handlers must be idempotent with respect to these events. When an event handler is registered NETDEV_REGISTER events are sent for all devices currently registered. Should any of them fail, we will send NETDEV_GOING_DOWN/NETDEV_DOWN/NETDEV_UNREGISTER events to that handler for the devices which have already been registered with it. The handler registration itself will fail. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aeed9e82cd
commit
fcc5a03ac4
2 changed files with 65 additions and 10 deletions
|
@ -157,6 +157,19 @@ extern int __srcu_notifier_call_chain(struct srcu_notifier_head *nh,
|
|||
*/
|
||||
#define NOTIFY_STOP (NOTIFY_OK|NOTIFY_STOP_MASK)
|
||||
|
||||
/* Encapsulate (negative) errno value (in particular, NOTIFY_BAD <=> EPERM). */
|
||||
static inline int notifier_from_errno(int err)
|
||||
{
|
||||
return NOTIFY_STOP_MASK | (NOTIFY_OK - err);
|
||||
}
|
||||
|
||||
/* Restore (negative) errno value from notify return value. */
|
||||
static inline int notifier_to_errno(int ret)
|
||||
{
|
||||
ret &= ~NOTIFY_STOP_MASK;
|
||||
return ret > NOTIFY_OK ? NOTIFY_OK - ret : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Declared notifiers so far. I can imagine quite a few more chains
|
||||
* over time (eg laptop power reset chains, reboot chain (to clean
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue