diff options
Diffstat (limited to 'net/ipv4/ipmr.c')
| -rw-r--r-- | net/ipv4/ipmr.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 9d78427652d2..fe54eba6d00d 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -268,7 +268,7 @@ static int __net_init ipmr_rules_init(struct net *net)  	return 0;  err2: -	kfree(mrt); +	ipmr_free_table(mrt);  err1:  	fib_rules_unregister(ops);  	return err; @@ -278,11 +278,13 @@ static void __net_exit ipmr_rules_exit(struct net *net)  {  	struct mr_table *mrt, *next; +	rtnl_lock();  	list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) {  		list_del(&mrt->list);  		ipmr_free_table(mrt);  	}  	fib_rules_unregister(net->ipv4.mr_rules_ops); +	rtnl_unlock();  }  #else  #define ipmr_for_each_table(mrt, net) \ @@ -308,7 +310,10 @@ static int __net_init ipmr_rules_init(struct net *net)  static void __net_exit ipmr_rules_exit(struct net *net)  { +	rtnl_lock();  	ipmr_free_table(net->ipv4.mrt); +	net->ipv4.mrt = NULL; +	rtnl_unlock();  }  #endif  |