diff --git a/net/core/dev.c b/net/core/dev.c index ef8cf7619baf..9d85ff5f400d 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1896,11 +1896,13 @@ static int dev_boot_phase = 1; int register_netdevice_notifier(struct notifier_block *nb) { struct net *net; - int err; + int err = -EINTR; /* Close race with setup_net() and cleanup_net() */ - down_write(&pernet_ops_rwsem); - rtnl_lock(); + if (down_write_killable(&pernet_ops_rwsem)) + goto unlock2; + if (rtnl_lock_killable()) + goto unlock1; err = raw_notifier_chain_register(&netdev_chain, nb); if (err) goto unlock; @@ -1914,7 +1916,9 @@ int register_netdevice_notifier(struct notifier_block *nb) unlock: rtnl_unlock(); +unlock1: up_write(&pernet_ops_rwsem); +unlock2: return err; rollback: