Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit ced98dd

Browse files
gregkhTreehugger Robot
authored andcommitted
Revert "mpls: no longer hold RTNL in mpls_netconf_dump_devconf()"
This reverts commit ff7abcc which is commit e0f89d2 upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: Id07c86501f972e0126dec0edbce4a5888187546b Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 50bb17d commit ced98dd

File tree

1 file changed

+37
-22
lines changed

1 file changed

+37
-22
lines changed

net/mpls/af_mpls.c

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,7 +1154,7 @@ static int mpls_netconf_fill_devconf(struct sk_buff *skb, struct mpls_dev *mdev,
11541154

11551155
if ((all || type == NETCONFA_INPUT) &&
11561156
nla_put_s32(skb, NETCONFA_INPUT,
1157-
READ_ONCE(mdev->input_enabled)) < 0)
1157+
mdev->input_enabled) < 0)
11581158
goto nla_put_failure;
11591159

11601160
nlmsg_end(skb, nlh);
@@ -1303,12 +1303,11 @@ static int mpls_netconf_dump_devconf(struct sk_buff *skb,
13031303
{
13041304
const struct nlmsghdr *nlh = cb->nlh;
13051305
struct net *net = sock_net(skb->sk);
1306-
struct {
1307-
unsigned long ifindex;
1308-
} *ctx = (void *)cb->ctx;
1306+
struct hlist_head *head;
13091307
struct net_device *dev;
13101308
struct mpls_dev *mdev;
1311-
int err = 0;
1309+
int idx, s_idx;
1310+
int h, s_h;
13121311

13131312
if (cb->strict_check) {
13141313
struct netlink_ext_ack *extack = cb->extack;
@@ -1325,23 +1324,40 @@ static int mpls_netconf_dump_devconf(struct sk_buff *skb,
13251324
}
13261325
}
13271326

1328-
rcu_read_lock();
1329-
for_each_netdev_dump(net, dev, ctx->ifindex) {
1330-
mdev = mpls_dev_get(dev);
1331-
if (!mdev)
1332-
continue;
1333-
err = mpls_netconf_fill_devconf(skb, mdev,
1334-
NETLINK_CB(cb->skb).portid,
1335-
nlh->nlmsg_seq,
1336-
RTM_NEWNETCONF,
1337-
NLM_F_MULTI,
1338-
NETCONFA_ALL);
1339-
if (err < 0)
1340-
break;
1327+
s_h = cb->args[0];
1328+
s_idx = idx = cb->args[1];
1329+
1330+
for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
1331+
idx = 0;
1332+
head = &net->dev_index_head[h];
1333+
rcu_read_lock();
1334+
cb->seq = net->dev_base_seq;
1335+
hlist_for_each_entry_rcu(dev, head, index_hlist) {
1336+
if (idx < s_idx)
1337+
goto cont;
1338+
mdev = mpls_dev_get(dev);
1339+
if (!mdev)
1340+
goto cont;
1341+
if (mpls_netconf_fill_devconf(skb, mdev,
1342+
NETLINK_CB(cb->skb).portid,
1343+
nlh->nlmsg_seq,
1344+
RTM_NEWNETCONF,
1345+
NLM_F_MULTI,
1346+
NETCONFA_ALL) < 0) {
1347+
rcu_read_unlock();
1348+
goto done;
1349+
}
1350+
nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1351+
cont:
1352+
idx++;
1353+
}
1354+
rcu_read_unlock();
13411355
}
1342-
rcu_read_unlock();
1356+
done:
1357+
cb->args[0] = h;
1358+
cb->args[1] = idx;
13431359

1344-
return err;
1360+
return skb->len;
13451361
}
13461362

13471363
#define MPLS_PERDEV_SYSCTL_OFFSET(field) \
@@ -2755,8 +2771,7 @@ static int __init mpls_init(void)
27552771
mpls_getroute, mpls_dump_routes, 0);
27562772
rtnl_register_module(THIS_MODULE, PF_MPLS, RTM_GETNETCONF,
27572773
mpls_netconf_get_devconf,
2758-
mpls_netconf_dump_devconf,
2759-
RTNL_FLAG_DUMP_UNLOCKED);
2774+
mpls_netconf_dump_devconf, 0);
27602775
err = ipgre_tunnel_encap_add_mpls_ops();
27612776
if (err)
27622777
pr_err("Can't add mpls over gre tunnel ops\n");

0 commit comments

Comments
 (0)