mc_lst->addr = *addr;
 
        rtnl_lock();
-       rcu_read_lock();
        if (ifindex == 0) {
                struct rt6_info *rt;
                rt = rt6_lookup(net, addr, NULL, 0, 0);
                        ip6_rt_put(rt);
                }
        } else
-               dev = dev_get_by_index_rcu(net, ifindex);
+               dev = __dev_get_by_index(net, ifindex);
 
        if (dev == NULL) {
-               rcu_read_unlock();
                rtnl_unlock();
                sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
                return -ENODEV;
        err = ipv6_dev_mc_inc(dev, addr);
 
        if (err) {
-               rcu_read_unlock();
                rtnl_unlock();
                sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
                return err;
        mc_lst->next = np->ipv6_mc_list;
        rcu_assign_pointer(np->ipv6_mc_list, mc_lst);
 
-       rcu_read_unlock();
        rtnl_unlock();
 
        return 0;
 
                        *lnk = mc_lst->next;
 
-                       rcu_read_lock();
-                       dev = dev_get_by_index_rcu(net, mc_lst->ifindex);
+                       dev = __dev_get_by_index(net, mc_lst->ifindex);
                        if (dev != NULL) {
                                struct inet6_dev *idev = __in6_dev_get(dev);
 
                                        __ipv6_dev_mc_dec(idev, &mc_lst->addr);
                        } else
                                (void) ip6_mc_leave_src(sk, mc_lst, NULL);
-                       rcu_read_unlock();
                        rtnl_unlock();
 
                        atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc);
 
                np->ipv6_mc_list = mc_lst->next;
 
-               rcu_read_lock();
-               dev = dev_get_by_index_rcu(net, mc_lst->ifindex);
+               dev = __dev_get_by_index(net, mc_lst->ifindex);
                if (dev) {
                        struct inet6_dev *idev = __in6_dev_get(dev);
 
                                __ipv6_dev_mc_dec(idev, &mc_lst->addr);
                } else
                        (void) ip6_mc_leave_src(sk, mc_lst, NULL);
-               rcu_read_unlock();
 
                atomic_sub(sizeof(*mc_lst), &sk->sk_omem_alloc);
                kfree_rcu(mc_lst, rcu);
        struct inet6_dev *idev;
        int err;
 
-       rcu_read_lock();
+       ASSERT_RTNL();
 
        idev = __in6_dev_get(dev);
        if (!idev)
        else
                err = __ipv6_dev_mc_dec(idev, addr);
 
-       rcu_read_unlock();
        return err;
 }