|
|
@@ -1592,14 +1592,15 @@ static int ip6mr_sk_init(struct mr6_table *mrt, struct sock *sk)
|
|
|
if (likely(mrt->mroute6_sk == NULL)) {
|
|
|
mrt->mroute6_sk = sk;
|
|
|
net->ipv6.devconf_all->mc_forwarding++;
|
|
|
- inet6_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING,
|
|
|
- NETCONFA_IFINDEX_ALL,
|
|
|
- net->ipv6.devconf_all);
|
|
|
- }
|
|
|
- else
|
|
|
+ } else {
|
|
|
err = -EADDRINUSE;
|
|
|
+ }
|
|
|
write_unlock_bh(&mrt_lock);
|
|
|
|
|
|
+ if (!err)
|
|
|
+ inet6_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING,
|
|
|
+ NETCONFA_IFINDEX_ALL,
|
|
|
+ net->ipv6.devconf_all);
|
|
|
rtnl_unlock();
|
|
|
|
|
|
return err;
|
|
|
@@ -1617,11 +1618,11 @@ int ip6mr_sk_done(struct sock *sk)
|
|
|
write_lock_bh(&mrt_lock);
|
|
|
mrt->mroute6_sk = NULL;
|
|
|
net->ipv6.devconf_all->mc_forwarding--;
|
|
|
+ write_unlock_bh(&mrt_lock);
|
|
|
inet6_netconf_notify_devconf(net,
|
|
|
NETCONFA_MC_FORWARDING,
|
|
|
NETCONFA_IFINDEX_ALL,
|
|
|
net->ipv6.devconf_all);
|
|
|
- write_unlock_bh(&mrt_lock);
|
|
|
|
|
|
mroute_clean_tables(mrt, false);
|
|
|
err = 0;
|