@@ -774,7 +774,8 @@ static struct net_device *ip6mr_reg_vif(struct net *net, struct mr6_table *mrt)
774
774
* Delete a VIF entry
775
775
*/
776
776
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 )
778
779
{
779
780
struct mif_device * v ;
780
781
struct net_device * dev ;
@@ -820,7 +821,7 @@ static int mif6_delete(struct mr6_table *mrt, int vifi, struct list_head *head)
820
821
dev -> ifindex , & in6_dev -> cnf );
821
822
}
822
823
823
- if (v -> flags & MIFF_REGISTER )
824
+ if (( v -> flags & MIFF_REGISTER ) && ! notify )
824
825
unregister_netdevice_queue (dev , head );
825
826
826
827
dev_put (dev );
@@ -1331,7 +1332,6 @@ static int ip6mr_device_event(struct notifier_block *this,
1331
1332
struct mr6_table * mrt ;
1332
1333
struct mif_device * v ;
1333
1334
int ct ;
1334
- LIST_HEAD (list );
1335
1335
1336
1336
if (event != NETDEV_UNREGISTER )
1337
1337
return NOTIFY_DONE ;
@@ -1340,10 +1340,9 @@ static int ip6mr_device_event(struct notifier_block *this,
1340
1340
v = & mrt -> vif6_table [0 ];
1341
1341
for (ct = 0 ; ct < mrt -> maxvif ; ct ++ , v ++ ) {
1342
1342
if (v -> dev == dev )
1343
- mif6_delete (mrt , ct , & list );
1343
+ mif6_delete (mrt , ct , 1 , NULL );
1344
1344
}
1345
1345
}
1346
- unregister_netdevice_many (& list );
1347
1346
1348
1347
return NOTIFY_DONE ;
1349
1348
}
@@ -1552,7 +1551,7 @@ static void mroute_clean_tables(struct mr6_table *mrt, bool all)
1552
1551
for (i = 0 ; i < mrt -> maxvif ; i ++ ) {
1553
1552
if (!all && (mrt -> vif6_table [i ].flags & VIFF_STATIC ))
1554
1553
continue ;
1555
- mif6_delete (mrt , i , & list );
1554
+ mif6_delete (mrt , i , 0 , & list );
1556
1555
}
1557
1556
unregister_netdevice_many (& list );
1558
1557
@@ -1707,7 +1706,7 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, uns
1707
1706
if (copy_from_user (& mifi , optval , sizeof (mifi_t )))
1708
1707
return - EFAULT ;
1709
1708
rtnl_lock ();
1710
- ret = mif6_delete (mrt , mifi , NULL );
1709
+ ret = mif6_delete (mrt , mifi , 0 , NULL );
1711
1710
rtnl_unlock ();
1712
1711
return ret ;
1713
1712
0 commit comments