struct inet6_ifaddr *ifp;
        struct inet6_dev *idev;
 
-       ASSERT_RTNL();
+       ASSERT_RTNL_NET(net);
 
        if (cfg->plen > 128) {
                NL_SET_ERR_MSG_MOD(extack, "Invalid prefix length");
        bool new_peer = false;
        bool had_prefixroute;
 
-       ASSERT_RTNL();
+       ASSERT_RTNL_NET(net);
 
        if (cfg->ifa_flags & IFA_F_MANAGETEMPADDR &&
            (ifp->flags & IFA_F_TEMPORARY || ifp->prefix_len != 64))
                }
        }
 
+       rtnl_net_lock(net);
+
        dev =  __dev_get_by_index(net, ifm->ifa_index);
        if (!dev) {
                NL_SET_ERR_MSG_MOD(extack, "Unable to find the interface");
-               return -ENODEV;
+               err = -ENODEV;
+               goto unlock;
        }
 
        idev = ipv6_find_idev(dev);
-       if (IS_ERR(idev))
-               return PTR_ERR(idev);
+       if (IS_ERR(idev)) {
+               err = PTR_ERR(idev);
+               goto unlock;
+       }
 
        if (!ipv6_allow_optimistic_dad(net, idev))
                cfg.ifa_flags &= ~IFA_F_OPTIMISTIC;
        if (cfg.ifa_flags & IFA_F_NODAD &&
            cfg.ifa_flags & IFA_F_OPTIMISTIC) {
                NL_SET_ERR_MSG(extack, "IFA_F_NODAD and IFA_F_OPTIMISTIC are mutually exclusive");
-               return -EINVAL;
+               err = -EINVAL;
+               goto unlock;
        }
 
        ifa = ipv6_get_ifaddr(net, cfg.pfx, dev, 1);
                 * It would be best to check for !NLM_F_CREATE here but
                 * userspace already relies on not having to provide this.
                 */
-               return inet6_addr_add(net, dev, &cfg, expires, flags, extack);
+               err = inet6_addr_add(net, dev, &cfg, expires, flags, extack);
+               goto unlock;
        }
 
        if (nlh->nlmsg_flags & NLM_F_EXCL ||
        }
 
        in6_ifa_put(ifa);
+unlock:
+       rtnl_net_unlock(net);
 
        return err;
 }
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETLINK,
         .dumpit = inet6_dump_ifinfo, .flags = RTNL_FLAG_DUMP_UNLOCKED},
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWADDR,
-        .doit = inet6_rtm_newaddr},
+        .doit = inet6_rtm_newaddr, .flags = RTNL_FLAG_DOIT_PERNET},
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELADDR,
         .doit = inet6_rtm_deladdr},
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETADDR,