Commit 8e15aee6 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Paolo Abeni

net: move altnames together with the netdevice

The altname nodes are currently not moved to the new netns
when netdevice itself moves:

  [ ~]# ip netns add test
  [ ~]# ip -netns test link add name eth0 type dummy
  [ ~]# ip -netns test link property add dev eth0 altname some-name
  [ ~]# ip -netns test link show dev some-name
  2: eth0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
      link/ether 1e:67:ed:19:3d:24 brd ff:ff:ff:ff:ff:ff
      altname some-name
  [ ~]# ip -netns test link set dev eth0 netns 1
  [ ~]# ip link
  ...
  3: eth0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
      link/ether 02:40:88:62:ec:b8 brd ff:ff:ff:ff:ff:ff
      altname some-name
  [ ~]# ip li show dev some-name
  Device "some-name" does not exist.

Remove them from the hash table when device is unlisted
and add back when listed again.

Fixes: 36fbf1e5 ("net: rtnetlink: add linkprop commands to add and delete alternative ifnames")
Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 1a83f4a7
...@@ -381,6 +381,7 @@ static void netdev_name_node_alt_flush(struct net_device *dev) ...@@ -381,6 +381,7 @@ static void netdev_name_node_alt_flush(struct net_device *dev)
/* Device list insertion */ /* Device list insertion */
static void list_netdevice(struct net_device *dev) static void list_netdevice(struct net_device *dev)
{ {
struct netdev_name_node *name_node;
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
ASSERT_RTNL(); ASSERT_RTNL();
...@@ -391,6 +392,10 @@ static void list_netdevice(struct net_device *dev) ...@@ -391,6 +392,10 @@ static void list_netdevice(struct net_device *dev)
hlist_add_head_rcu(&dev->index_hlist, hlist_add_head_rcu(&dev->index_hlist,
dev_index_hash(net, dev->ifindex)); dev_index_hash(net, dev->ifindex));
write_unlock(&dev_base_lock); write_unlock(&dev_base_lock);
netdev_for_each_altname(dev, name_node)
netdev_name_node_add(net, name_node);
/* We reserved the ifindex, this can't fail */ /* We reserved the ifindex, this can't fail */
WARN_ON(xa_store(&net->dev_by_index, dev->ifindex, dev, GFP_KERNEL)); WARN_ON(xa_store(&net->dev_by_index, dev->ifindex, dev, GFP_KERNEL));
...@@ -402,12 +407,16 @@ static void list_netdevice(struct net_device *dev) ...@@ -402,12 +407,16 @@ static void list_netdevice(struct net_device *dev)
*/ */
static void unlist_netdevice(struct net_device *dev, bool lock) static void unlist_netdevice(struct net_device *dev, bool lock)
{ {
struct netdev_name_node *name_node;
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
ASSERT_RTNL(); ASSERT_RTNL();
xa_erase(&net->dev_by_index, dev->ifindex); xa_erase(&net->dev_by_index, dev->ifindex);
netdev_for_each_altname(dev, name_node)
netdev_name_node_del(name_node);
/* Unlink dev from the device chain */ /* Unlink dev from the device chain */
if (lock) if (lock)
write_lock(&dev_base_lock); write_lock(&dev_base_lock);
...@@ -10942,7 +10951,6 @@ void unregister_netdevice_many_notify(struct list_head *head, ...@@ -10942,7 +10951,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
synchronize_net(); synchronize_net();
list_for_each_entry(dev, head, unreg_list) { list_for_each_entry(dev, head, unreg_list) {
struct netdev_name_node *name_node;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
/* Shutdown queueing discipline. */ /* Shutdown queueing discipline. */
...@@ -10970,9 +10978,6 @@ void unregister_netdevice_many_notify(struct list_head *head, ...@@ -10970,9 +10978,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
dev_uc_flush(dev); dev_uc_flush(dev);
dev_mc_flush(dev); dev_mc_flush(dev);
netdev_for_each_altname(dev, name_node)
netdev_name_node_del(name_node);
synchronize_rcu();
netdev_name_node_alt_flush(dev); netdev_name_node_alt_flush(dev);
netdev_name_node_free(dev->name_node); netdev_name_node_free(dev->name_node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment