mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
ipv6: addrconf: don't use rtnl mutex in RTM_GETADDR
Similar to the previous patch, use the device lookup functions that bump device refcount and flag this as DOIT_UNLOCKED to avoid rtnl mutex. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4ea2607f78
commit
c24675f871
1 changed files with 7 additions and 7 deletions
|
@ -4890,17 +4890,15 @@ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||||
err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
|
err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, ifa_ipv6_policy,
|
||||||
extack);
|
extack);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
return err;
|
||||||
|
|
||||||
addr = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL], &peer);
|
addr = extract_addr(tb[IFA_ADDRESS], tb[IFA_LOCAL], &peer);
|
||||||
if (!addr) {
|
if (!addr)
|
||||||
err = -EINVAL;
|
return -EINVAL;
|
||||||
goto errout;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifm = nlmsg_data(nlh);
|
ifm = nlmsg_data(nlh);
|
||||||
if (ifm->ifa_index)
|
if (ifm->ifa_index)
|
||||||
dev = __dev_get_by_index(net, ifm->ifa_index);
|
dev = dev_get_by_index(net, ifm->ifa_index);
|
||||||
|
|
||||||
ifa = ipv6_get_ifaddr(net, addr, dev, 1);
|
ifa = ipv6_get_ifaddr(net, addr, dev, 1);
|
||||||
if (!ifa) {
|
if (!ifa) {
|
||||||
|
@ -4926,6 +4924,8 @@ static int inet6_rtm_getaddr(struct sk_buff *in_skb, struct nlmsghdr *nlh,
|
||||||
errout_ifa:
|
errout_ifa:
|
||||||
in6_ifa_put(ifa);
|
in6_ifa_put(ifa);
|
||||||
errout:
|
errout:
|
||||||
|
if (dev)
|
||||||
|
dev_put(dev);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6568,7 +6568,7 @@ int __init addrconf_init(void)
|
||||||
__rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, 0);
|
__rtnl_register(PF_INET6, RTM_NEWADDR, inet6_rtm_newaddr, NULL, 0);
|
||||||
__rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, 0);
|
__rtnl_register(PF_INET6, RTM_DELADDR, inet6_rtm_deladdr, NULL, 0);
|
||||||
__rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr,
|
__rtnl_register(PF_INET6, RTM_GETADDR, inet6_rtm_getaddr,
|
||||||
inet6_dump_ifaddr, 0);
|
inet6_dump_ifaddr, RTNL_FLAG_DOIT_UNLOCKED);
|
||||||
__rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL,
|
__rtnl_register(PF_INET6, RTM_GETMULTICAST, NULL,
|
||||||
inet6_dump_ifmcaddr, 0);
|
inet6_dump_ifmcaddr, 0);
|
||||||
__rtnl_register(PF_INET6, RTM_GETANYCAST, NULL,
|
__rtnl_register(PF_INET6, RTM_GETANYCAST, NULL,
|
||||||
|
|
Loading…
Reference in a new issue