diff options
| -rw-r--r-- | drivers/net/netconsole.c | 8 | 
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index dfb67eb2a94..eb41e44921e 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this,  		goto done;  	spin_lock_irqsave(&target_list_lock, flags); +restart:  	list_for_each_entry(nt, &target_list, list) {  		netconsole_target_get(nt);  		if (nt->np.dev == dev) { @@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this,  				 * rtnl_lock already held  				 */  				if (nt->np.dev) { +					spin_unlock_irqrestore( +							      &target_list_lock, +							      flags);  					__netpoll_cleanup(&nt->np); +					spin_lock_irqsave(&target_list_lock, +							  flags);  					dev_put(nt->np.dev);  					nt->np.dev = NULL; +					netconsole_target_put(nt); +					goto restart;  				}  				/* Fall through */  			case NETDEV_GOING_DOWN:  |