@@ -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 );
@@ -1330,7 +1331,6 @@ static int ip6mr_device_event(struct notifier_block *this,
13301331 struct mr6_table * mrt ;
13311332 struct mif_device * v ;
13321333 int ct ;
1333- LIST_HEAD (list );
13341334
13351335 if (event != NETDEV_UNREGISTER )
13361336 return NOTIFY_DONE ;
@@ -1339,10 +1339,9 @@ static int ip6mr_device_event(struct notifier_block *this,
13391339 v = & mrt -> vif6_table [0 ];
13401340 for (ct = 0 ; ct < mrt -> maxvif ; ct ++ , v ++ ) {
13411341 if (v -> dev == dev )
1342- mif6_delete (mrt , ct , & list );
1342+ mif6_delete (mrt , ct , 1 , NULL );
13431343 }
13441344 }
1345- unregister_netdevice_many (& list );
13461345
13471346 return NOTIFY_DONE ;
13481347}
@@ -1551,7 +1550,7 @@ static void mroute_clean_tables(struct mr6_table *mrt, bool all)
15511550 for (i = 0 ; i < mrt -> maxvif ; i ++ ) {
15521551 if (!all && (mrt -> vif6_table [i ].flags & VIFF_STATIC ))
15531552 continue ;
1554- mif6_delete (mrt , i , & list );
1553+ mif6_delete (mrt , i , 0 , & list );
15551554 }
15561555 unregister_netdevice_many (& list );
15571556
@@ -1704,7 +1703,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
17041703 if (copy_from_user (& mifi , optval , sizeof (mifi_t )))
17051704 return - EFAULT ;
17061705 rtnl_lock ();
1707- ret = mif6_delete (mrt , mifi , NULL );
1706+ ret = mif6_delete (mrt , mifi , 0 , NULL );
17081707 rtnl_unlock ();
17091708 return ret ;
17101709
0 commit comments