@@ -774,7 +774,8 @@ static struct net_device *ip6mr_reg_vif(struct net *net, struct mr6_table *mrt)
774774 * Delete a VIF entry
775775 */
776776
777- static int mif6_delete (struct mr6_table * mrt , int vifi , struct list_head * head )
777+ static int mif6_delete (struct mr6_table * mrt , int vifi , int notify ,
778+ struct list_head * head )
778779{
779780 struct mif_device * v ;
780781 struct net_device * dev ;
@@ -820,7 +821,7 @@ static int mif6_delete(struct mr6_table *mrt, int vifi, struct list_head *head)
820821 dev -> ifindex , & in6_dev -> cnf );
821822 }
822823
823- if (v -> flags & MIFF_REGISTER )
824+ if (( v -> flags & MIFF_REGISTER ) && ! notify )
824825 unregister_netdevice_queue (dev , head );
825826
826827 dev_put (dev );
@@ -1331,7 +1332,6 @@ static int ip6mr_device_event(struct notifier_block *this,
13311332 struct mr6_table * mrt ;
13321333 struct mif_device * v ;
13331334 int ct ;
1334- LIST_HEAD (list );
13351335
13361336 if (event != NETDEV_UNREGISTER )
13371337 return NOTIFY_DONE ;
@@ -1340,10 +1340,9 @@ static int ip6mr_device_event(struct notifier_block *this,
13401340 v = & mrt -> vif6_table [0 ];
13411341 for (ct = 0 ; ct < mrt -> maxvif ; ct ++ , v ++ ) {
13421342 if (v -> dev == dev )
1343- mif6_delete (mrt , ct , & list );
1343+ mif6_delete (mrt , ct , 1 , NULL );
13441344 }
13451345 }
1346- unregister_netdevice_many (& list );
13471346
13481347 return NOTIFY_DONE ;
13491348}
@@ -1552,7 +1551,7 @@ static void mroute_clean_tables(struct mr6_table *mrt, bool all)
15521551 for (i = 0 ; i < mrt -> maxvif ; i ++ ) {
15531552 if (!all && (mrt -> vif6_table [i ].flags & VIFF_STATIC ))
15541553 continue ;
1555- mif6_delete (mrt , i , & list );
1554+ mif6_delete (mrt , i , 0 , & list );
15561555 }
15571556 unregister_netdevice_many (& list );
15581557
@@ -1707,7 +1706,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
17071706 if (copy_from_user (& mifi , optval , sizeof (mifi_t )))
17081707 return - EFAULT ;
17091708 rtnl_lock ();
1710- ret = mif6_delete (mrt , mifi , NULL );
1709+ ret = mif6_delete (mrt , mifi , 0 , NULL );
17111710 rtnl_unlock ();
17121711 return ret ;
17131712
0 commit comments