Skip to content

Commit be94cfd

Browse files
q2venkuba-moo
authored andcommitted
dev: Hold rtnl_net_lock() for dev_ifsioc().
Basically, dev_ifsioc() operates on the passed single netns (except for netdev notifier chains with lower/upper devices for which we will need more changes). Let's hold rtnl_net_lock() for dev_ifsioc(). Now that NETDEV_CHANGENAME is always triggered under rtnl_net_lock() of the device's netns. (do_setlink() and dev_ifsioc()) Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Link: https://patch.msgid.link/20250115095545.52709-4-kuniyu@amazon.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 2f1bb1e commit be94cfd

File tree

3 files changed

+22
-26
lines changed

3 files changed

+22
-26
lines changed

net/core/dev.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,16 +1348,13 @@ static int dev_get_valid_name(struct net *net, struct net_device *dev,
13481348
*/
13491349
int dev_change_name(struct net_device *dev, const char *newname)
13501350
{
1351+
struct net *net = dev_net(dev);
13511352
unsigned char old_assign_type;
13521353
char oldname[IFNAMSIZ];
13531354
int err = 0;
13541355
int ret;
1355-
struct net *net;
1356-
1357-
ASSERT_RTNL();
1358-
BUG_ON(!dev_net(dev));
13591356

1360-
net = dev_net(dev);
1357+
ASSERT_RTNL_NET(net);
13611358

13621359
if (!strncmp(newname, dev->name, IFNAMSIZ))
13631360
return 0;

net/core/dev_ioctl.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ static int dev_siocwandev(struct net_device *dev, struct if_settings *ifs)
543543
}
544544

545545
/*
546-
* Perform the SIOCxIFxxx calls, inside rtnl_lock()
546+
* Perform the SIOCxIFxxx calls, inside rtnl_net_lock()
547547
*/
548548
static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
549549
unsigned int cmd)
@@ -620,11 +620,14 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
620620
return -ENODEV;
621621
if (!netif_is_bridge_master(dev))
622622
return -EOPNOTSUPP;
623+
623624
netdev_hold(dev, &dev_tracker, GFP_KERNEL);
624-
rtnl_unlock();
625+
rtnl_net_unlock(net);
626+
625627
err = br_ioctl_call(net, netdev_priv(dev), cmd, ifr, NULL);
628+
626629
netdev_put(dev, &dev_tracker);
627-
rtnl_lock();
630+
rtnl_net_lock(net);
628631
return err;
629632

630633
case SIOCDEVPRIVATE ... SIOCDEVPRIVATE + 15:
@@ -770,9 +773,11 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr,
770773
dev_load(net, ifr->ifr_name);
771774
if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
772775
return -EPERM;
773-
rtnl_lock();
776+
777+
rtnl_net_lock(net);
774778
ret = dev_ifsioc(net, ifr, data, cmd);
775-
rtnl_unlock();
779+
rtnl_net_unlock(net);
780+
776781
if (colon)
777782
*colon = ':';
778783
return ret;
@@ -816,9 +821,11 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr,
816821
case SIOCBONDSLAVEINFOQUERY:
817822
case SIOCBONDINFOQUERY:
818823
dev_load(net, ifr->ifr_name);
819-
rtnl_lock();
824+
825+
rtnl_net_lock(net);
820826
ret = dev_ifsioc(net, ifr, data, cmd);
821-
rtnl_unlock();
827+
rtnl_net_unlock(net);
828+
822829
if (need_copyout)
823830
*need_copyout = false;
824831
return ret;
@@ -841,9 +848,10 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr,
841848
(cmd >= SIOCDEVPRIVATE &&
842849
cmd <= SIOCDEVPRIVATE + 15)) {
843850
dev_load(net, ifr->ifr_name);
844-
rtnl_lock();
851+
852+
rtnl_net_lock(net);
845853
ret = dev_ifsioc(net, ifr, data, cmd);
846-
rtnl_unlock();
854+
rtnl_net_unlock(net);
847855
return ret;
848856
}
849857
return -ENOTTY;

net/core/rtnl_net_debug.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ static int rtnl_net_debug_event(struct notifier_block *nb,
2727
case NETDEV_CHANGEADDR:
2828
case NETDEV_PRE_CHANGEADDR:
2929
case NETDEV_GOING_DOWN:
30-
case NETDEV_CHANGENAME:
3130
case NETDEV_FEAT_CHANGE:
3231
case NETDEV_BONDING_FAILOVER:
3332
case NETDEV_PRE_UP:
@@ -60,18 +59,10 @@ static int rtnl_net_debug_event(struct notifier_block *nb,
6059
ASSERT_RTNL();
6160
break;
6261

63-
/* Once an event fully supports RTNL_NET, move it here
64-
* and remove "if (0)" below.
65-
*
66-
* case NETDEV_XXX:
67-
* ASSERT_RTNL_NET(net);
68-
* break;
69-
*/
70-
}
71-
72-
/* Just to avoid unused-variable error for dev and net. */
73-
if (0)
62+
case NETDEV_CHANGENAME:
7463
ASSERT_RTNL_NET(net);
64+
break;
65+
}
7566

7667
return NOTIFY_DONE;
7768
}

0 commit comments

Comments
 (0)