Skip to content

Commit 68ed5c3

Browse files
q2venPaolo Abeni
authored andcommitted
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 <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 08a9572 commit 68ed5c3

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

include/net/phonet/pn_dev.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ int phonet_address_add(struct net_device *dev, u8 addr);
3838
int phonet_address_del(struct net_device *dev, u8 addr);
3939
u8 phonet_address_get(struct net_device *dev, u8 addr);
4040
int phonet_address_lookup(struct net *net, u8 addr);
41-
void phonet_address_notify(int event, struct net_device *dev, u8 addr);
41+
void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr);
4242

4343
int phonet_route_add(struct net_device *dev, u8 daddr);
4444
int phonet_route_del(struct net_device *dev, u8 daddr);

net/phonet/pn_dev.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,13 @@ static void phonet_device_destroy(struct net_device *dev)
9898
mutex_unlock(&pndevs->lock);
9999

100100
if (pnd) {
101+
struct net *net = dev_net(dev);
102+
u32 ifindex = dev->ifindex;
101103
u8 addr;
102104

103105
for_each_set_bit(addr, pnd->addrs, 64)
104-
phonet_address_notify(RTM_DELADDR, dev, addr);
106+
phonet_address_notify(net, RTM_DELADDR, ifindex, addr);
107+
105108
kfree(pnd);
106109
}
107110
}
@@ -244,8 +247,9 @@ static int phonet_device_autoconf(struct net_device *dev)
244247
ret = phonet_address_add(dev, req.ifr_phonet_autoconf.device);
245248
if (ret)
246249
return ret;
247-
phonet_address_notify(RTM_NEWADDR, dev,
248-
req.ifr_phonet_autoconf.device);
250+
251+
phonet_address_notify(dev_net(dev), RTM_NEWADDR, dev->ifindex,
252+
req.ifr_phonet_autoconf.device);
249253
return 0;
250254
}
251255

net/phonet/pn_netlink.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
static int fill_addr(struct sk_buff *skb, u32 ifindex, u8 addr,
2323
u32 portid, u32 seq, int event);
2424

25-
void phonet_address_notify(int event, struct net_device *dev, u8 addr)
25+
void phonet_address_notify(struct net *net, int event, u32 ifindex, u8 addr)
2626
{
2727
struct sk_buff *skb;
2828
int err = -ENOBUFS;
@@ -32,17 +32,17 @@ void phonet_address_notify(int event, struct net_device *dev, u8 addr)
3232
if (skb == NULL)
3333
goto errout;
3434

35-
err = fill_addr(skb, dev->ifindex, addr, 0, 0, event);
35+
err = fill_addr(skb, ifindex, addr, 0, 0, event);
3636
if (err < 0) {
3737
WARN_ON(err == -EMSGSIZE);
3838
kfree_skb(skb);
3939
goto errout;
4040
}
41-
rtnl_notify(skb, dev_net(dev), 0,
42-
RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
41+
42+
rtnl_notify(skb, net, 0, RTNLGRP_PHONET_IFADDR, NULL, GFP_KERNEL);
4343
return;
4444
errout:
45-
rtnl_set_sk_err(dev_net(dev), RTNLGRP_PHONET_IFADDR, err);
45+
rtnl_set_sk_err(net, RTNLGRP_PHONET_IFADDR, err);
4646
}
4747

4848
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,
8989
else
9090
err = phonet_address_del(dev, pnaddr);
9191
if (!err)
92-
phonet_address_notify(nlh->nlmsg_type, dev, pnaddr);
92+
phonet_address_notify(net, nlh->nlmsg_type, ifm->ifa_index, pnaddr);
9393
return err;
9494
}
9595

0 commit comments

Comments
 (0)