diff options
Diffstat (limited to 'net/ipv6/ip6mr.c')
| -rw-r--r-- | net/ipv6/ip6mr.c | 19 | 
1 files changed, 8 insertions, 11 deletions
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index ad19136086dd..a10e77103c88 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -118,7 +118,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,  			      int cmd);  static int ip6mr_rtm_dumproute(struct sk_buff *skb,  			       struct netlink_callback *cb); -static void mroute_clean_tables(struct mr6_table *mrt); +static void mroute_clean_tables(struct mr6_table *mrt, bool all);  static void ipmr_expire_process(unsigned long arg);  #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES @@ -334,7 +334,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id)  static void ip6mr_free_table(struct mr6_table *mrt)  {  	del_timer_sync(&mrt->ipmr_expire_timer); -	mroute_clean_tables(mrt); +	mroute_clean_tables(mrt, true);  	kfree(mrt);  } @@ -765,10 +765,6 @@ static struct net_device *ip6mr_reg_vif(struct net *net, struct mr6_table *mrt)  	return dev;  failure: -	/* allow the register to be completed before unregistering. */ -	rtnl_unlock(); -	rtnl_lock(); -  	unregister_netdevice(dev);  	return NULL;  } @@ -1542,7 +1538,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,   *	Close the multicast socket, and clear the vif tables etc   */ -static void mroute_clean_tables(struct mr6_table *mrt) +static void mroute_clean_tables(struct mr6_table *mrt, bool all)  {  	int i;  	LIST_HEAD(list); @@ -1552,8 +1548,9 @@ static void mroute_clean_tables(struct mr6_table *mrt)  	 *	Shut down all active vif entries  	 */  	for (i = 0; i < mrt->maxvif; i++) { -		if (!(mrt->vif6_table[i].flags & VIFF_STATIC)) -			mif6_delete(mrt, i, &list); +		if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC)) +			continue; +		mif6_delete(mrt, i, &list);  	}  	unregister_netdevice_many(&list); @@ -1562,7 +1559,7 @@ static void mroute_clean_tables(struct mr6_table *mrt)  	 */  	for (i = 0; i < MFC6_LINES; i++) {  		list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) { -			if (c->mfc_flags & MFC_STATIC) +			if (!all && (c->mfc_flags & MFC_STATIC))  				continue;  			write_lock_bh(&mrt_lock);  			list_del(&c->list); @@ -1625,7 +1622,7 @@ int ip6mr_sk_done(struct sock *sk)  						     net->ipv6.devconf_all);  			write_unlock_bh(&mrt_lock); -			mroute_clean_tables(mrt); +			mroute_clean_tables(mrt, false);  			err = 0;  			break;  		}  | 
