diff options
Diffstat (limited to 'drivers/net/netconsole.c')
| -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 dfb67eb2a94b..eb41e44921e6 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c | |||
| @@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this, | |||
| 671 | goto done; | 671 | goto done; |
| 672 | 672 | ||
| 673 | spin_lock_irqsave(&target_list_lock, flags); | 673 | spin_lock_irqsave(&target_list_lock, flags); |
| 674 | restart: | ||
| 674 | list_for_each_entry(nt, &target_list, list) { | 675 | list_for_each_entry(nt, &target_list, list) { |
| 675 | netconsole_target_get(nt); | 676 | netconsole_target_get(nt); |
| 676 | if (nt->np.dev == dev) { | 677 | if (nt->np.dev == dev) { |
| @@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this, | |||
| 683 | * rtnl_lock already held | 684 | * rtnl_lock already held |
| 684 | */ | 685 | */ |
| 685 | if (nt->np.dev) { | 686 | if (nt->np.dev) { |
| 687 | spin_unlock_irqrestore( | ||
| 688 | &target_list_lock, | ||
| 689 | flags); | ||
| 686 | __netpoll_cleanup(&nt->np); | 690 | __netpoll_cleanup(&nt->np); |
| 691 | spin_lock_irqsave(&target_list_lock, | ||
| 692 | flags); | ||
| 687 | dev_put(nt->np.dev); | 693 | dev_put(nt->np.dev); |
| 688 | nt->np.dev = NULL; | 694 | nt->np.dev = NULL; |
| 695 | netconsole_target_put(nt); | ||
| 696 | goto restart; | ||
| 689 | } | 697 | } |
| 690 | /* Fall through */ | 698 | /* Fall through */ |
| 691 | case NETDEV_GOING_DOWN: | 699 | case NETDEV_GOING_DOWN: |
