mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 09:12:07 +00:00
phonet: Pass net and ifindex to phonet_address_notify().
Currently, phonet_address_notify() fetches netns and ifindex from dev. Once addr_doit() is converted to RCU, phonet_address_notify() will be called outside of RCU due to GFP_KERNEL, and dev will be unavailable there. Let's pass net and ifindex to phonet_address_notify(). Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
08a9572be3
commit
68ed5c38b5
@ -38,7 +38,7 @@ int phonet_address_add(struct net_device *dev, u8 addr);
|
||||
int phonet_address_del(struct net_device *dev, u8 addr);
|
||||
u8 phonet_address_get(struct net_device *dev, u8 addr);
|
||||
int phonet_address_lookup(struct net *net, u8 addr);
|
||||
void phonet_address_notify(int event, struct net_device *dev, u8 addr);
|
||||
void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr);
|
||||
|
||||
int phonet_route_add(struct net_device *dev, u8 daddr);
|
||||
int phonet_route_del(struct net_device *dev, u8 daddr);
|
||||
|
@ -98,10 +98,13 @@ static void phonet_device_destroy(struct net_device *dev)
|
||||
mutex_unlock(&pndevs->lock);
|
||||
|
||||
if (pnd) {
|
||||
struct net *net = dev_net(dev);
|
||||
u32 ifindex = dev->ifindex;
|
||||
u8 addr;
|
||||
|
||||
for_each_set_bit(addr, pnd->addrs, 64)
|
||||
phonet_address_notify(RTM_DELADDR, dev, addr);
|
||||
phonet_address_notify(net, RTM_DELADDR, ifindex, addr);
|
||||
|
||||
kfree(pnd);
|
||||
}
|
||||
}
|
||||
@ -244,8 +247,9 @@ static int phonet_device_autoconf(struct net_device *dev)
|
||||
ret = phonet_address_add(dev, req.ifr_phonet_autoconf.device);
|
||||
if (ret)
|
||||
return ret;
|
||||
phonet_address_notify(RTM_NEWADDR, dev,
|
||||
req.ifr_phonet_autoconf.device);
|
||||
|
||||
phonet_address_notify(dev_net(dev), RTM_NEWADDR, dev->ifindex,
|
||||
req.ifr_phonet_autoconf.device);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
static int fill_addr(struct sk_buff *skb, u32 ifindex, u8 addr,
|
||||
u32 portid, u32 seq, int event);
|
||||
|
||||
void phonet_address_notify(int event, struct net_device *dev, u8 addr)
|
||||
void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
int err = -ENOBUFS;
|
||||
@ -32,17 +32,17 @@ void phonet_address_notify(int event, struct net_device *dev, u8 addr)
|
||||
if (skb == NULL)
|
||||
goto errout;
|
||||
|
||||
err = fill_addr(skb, dev->ifindex, addr, 0, 0, event);
|
||||
err = fill_addr(skb, ifindex, addr, 0, 0, event);
|
||||
if (err < 0) {
|
||||
WARN_ON(err == -EMSGSIZE);
|
||||
kfree_skb(skb);
|
||||
goto errout;
|
||||
}
|
||||
rtnl_notify(skb, dev_net(dev), 0,
|
||||
RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
|
||||
|
||||
rtnl_notify(skb, net, 0, RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
|
||||
return;
|
||||
errout:
|
||||
rtnl_set_sk_err(dev_net(dev), RTNLGRP_PHONET_IFADDR, err);
|
||||
rtnl_set_sk_err(net, RTNLGRP_PHONET_IFADDR, err);
|
||||
}
|
||||
|
||||
static const struct nla_policy ifa_phonet_policy[IFA_MAX+1] = {
|
||||
@ -89,7 +89,7 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
else
|
||||
err = phonet_address_del(dev, pnaddr);
|
||||
if (!err)
|
||||
phonet_address_notify(nlh->nlmsg_type, dev, pnaddr);
|
||||
phonet_address_notify(net, nlh->nlmsg_type, ifm->ifa_index, pnaddr);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user