Skip to content

Commit 8786e98

Browse files
q2venPaolo Abeni
authored andcommitted
phonet: Don't hold RTNL for addr_doit().
Now only __dev_get_by_index() depends on RTNL in addr_doit(). Let's use dev_get_by_index_rcu() and register addr_doit() with RTNL_FLAG_DOIT_UNLOCKED. While at it, I changed phonet_rtnl_msg_handlers[]'s init to C99 style like other core networking code. Signed-off-by: Kuniyuki Iwashima <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 42f5fe1 commit 8786e98

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

net/phonet/pn_netlink.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,6 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
6565
if (!netlink_capable(skb, CAP_SYS_ADMIN))
6666
return -EPERM;
6767

68-
ASSERT_RTNL();
69-
7068
err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFA_MAX,
7169
ifa_phonet_policy, extack);
7270
if (err < 0)
@@ -80,16 +78,24 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
8078
/* Phonet addresses only have 6 high-order bits */
8179
return -EINVAL;
8280

83-
dev = __dev_get_by_index(net, ifm->ifa_index);
84-
if (dev == NULL)
81+
rcu_read_lock();
82+
83+
dev = dev_get_by_index_rcu(net, ifm->ifa_index);
84+
if (!dev) {
85+
rcu_read_unlock();
8586
return -ENODEV;
87+
}
8688

8789
if (nlh->nlmsg_type == RTM_NEWADDR)
8890
err = phonet_address_add(dev, pnaddr);
8991
else
9092
err = phonet_address_del(dev, pnaddr);
93+
94+
rcu_read_unlock();
95+
9196
if (!err)
9297
phonet_address_notify(net, nlh->nlmsg_type, ifm->ifa_index, pnaddr);
98+
9399
return err;
94100
}
95101

@@ -287,13 +293,18 @@ static int route_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
287293
}
288294

289295
static const struct rtnl_msg_handler phonet_rtnl_msg_handlers[] __initdata_or_module = {
290-
{THIS_MODULE, PF_PHONET, RTM_NEWADDR, addr_doit, NULL, 0},
291-
{THIS_MODULE, PF_PHONET, RTM_DELADDR, addr_doit, NULL, 0},
292-
{THIS_MODULE, PF_PHONET, RTM_GETADDR, NULL, getaddr_dumpit, 0},
293-
{THIS_MODULE, PF_PHONET, RTM_NEWROUTE, route_doit, NULL, 0},
294-
{THIS_MODULE, PF_PHONET, RTM_DELROUTE, route_doit, NULL, 0},
295-
{THIS_MODULE, PF_PHONET, RTM_GETROUTE, NULL, route_dumpit,
296-
RTNL_FLAG_DUMP_UNLOCKED},
296+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_NEWADDR,
297+
.doit = addr_doit, .flags = RTNL_FLAG_DOIT_UNLOCKED},
298+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_DELADDR,
299+
.doit = addr_doit, .flags = RTNL_FLAG_DOIT_UNLOCKED},
300+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_GETADDR,
301+
.dumpit = getaddr_dumpit},
302+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_NEWROUTE,
303+
.doit = route_doit},
304+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_DELROUTE,
305+
.doit = route_doit},
306+
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_GETROUTE,
307+
.dumpit = route_dumpit, .flags = RTNL_FLAG_DUMP_UNLOCKED},
297308
};
298309

299310
int __init phonet_netlink_register(void)

0 commit comments

Comments
 (0)