Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arp: Convert SIOCDARP and SIOCSARP to per-netns RTNL.

ioctl(SIOCDARP/SIOCSARP) operates on a single netns fetched from
an AF_INET socket in inet_ioctl().

Let's hold rtnl_net_lock() for SIOCDARP and SIOCSARP.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250211045057.10419-1-kuniyu@amazon.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Kuniyuki Iwashima and committed by
Paolo Abeni
7aca0d8a a3783dbf

+6 -6
+6 -6
net/ipv4/arp.c
··· 1062 1062 IPV4_DEVCONF_ALL(net, PROXY_ARP) = on; 1063 1063 return 0; 1064 1064 } 1065 - if (__in_dev_get_rtnl(dev)) { 1066 - IN_DEV_CONF_SET(__in_dev_get_rtnl(dev), PROXY_ARP, on); 1065 + if (__in_dev_get_rtnl_net(dev)) { 1066 + IN_DEV_CONF_SET(__in_dev_get_rtnl_net(dev), PROXY_ARP, on); 1067 1067 return 0; 1068 1068 } 1069 1069 return -ENXIO; ··· 1293 1293 1294 1294 switch (cmd) { 1295 1295 case SIOCDARP: 1296 - rtnl_lock(); 1296 + rtnl_net_lock(net); 1297 1297 err = arp_req_delete(net, &r); 1298 - rtnl_unlock(); 1298 + rtnl_net_unlock(net); 1299 1299 break; 1300 1300 case SIOCSARP: 1301 - rtnl_lock(); 1301 + rtnl_net_lock(net); 1302 1302 err = arp_req_set(net, &r); 1303 - rtnl_unlock(); 1303 + rtnl_net_unlock(net); 1304 1304 break; 1305 1305 case SIOCGARP: 1306 1306 rcu_read_lock();