Skip to content

Commit 17a1ac0

Browse files
q2venPaolo Abeni
authored andcommitted
phonet: Don't hold RTNL for route_doit().
Now only __dev_get_by_index() depends on RTNL in route_doit(). Let's use dev_get_by_index_rcu() and register route_doit() with RTNL_FLAG_DOIT_UNLOCKED. Signed-off-by: Kuniyuki Iwashima <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 3deec3b commit 17a1ac0

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

net/phonet/pn_netlink.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,6 @@ static int route_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
245245
if (!netlink_capable(skb, CAP_SYS_ADMIN))
246246
return -EPERM;
247247

248-
ASSERT_RTNL();
249-
250248
err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
251249
rtm_phonet_policy, extack);
252250
if (err < 0)
@@ -262,16 +260,25 @@ static int route_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
262260
return -EINVAL;
263261

264262
ifindex = nla_get_u32(tb[RTA_OIF]);
265-
dev = __dev_get_by_index(net, ifindex);
266-
if (dev == NULL)
263+
264+
rcu_read_lock();
265+
266+
dev = dev_get_by_index_rcu(net, ifindex);
267+
if (!dev) {
268+
rcu_read_unlock();
267269
return -ENODEV;
270+
}
268271

269272
if (nlh->nlmsg_type == RTM_NEWROUTE)
270273
err = phonet_route_add(dev, dst);
271274
else
272275
err = phonet_route_del(dev, dst);
276+
277+
rcu_read_unlock();
278+
273279
if (!err)
274280
rtm_phonet_notify(net, nlh->nlmsg_type, ifindex, dst);
281+
275282
return err;
276283
}
277284

@@ -308,9 +315,9 @@ static const struct rtnl_msg_handler phonet_rtnl_msg_handlers[] __initdata_or_mo
308315
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_GETADDR,
309316
.dumpit = getaddr_dumpit, .flags = RTNL_FLAG_DUMP_UNLOCKED},
310317
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_NEWROUTE,
311-
.doit = route_doit},
318+
.doit = route_doit, .flags = RTNL_FLAG_DOIT_UNLOCKED},
312319
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_DELROUTE,
313-
.doit = route_doit},
320+
.doit = route_doit, .flags = RTNL_FLAG_DOIT_UNLOCKED},
314321
{.owner = THIS_MODULE, .protocol = PF_PHONET, .msgtype = RTM_GETROUTE,
315322
.dumpit = route_dumpit, .flags = RTNL_FLAG_DUMP_UNLOCKED},
316323
};

0 commit comments

Comments
 (0)