mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
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: 36fbf1e52b
("net: rtnetlink: add linkprop commands to add and delete alternative ifnames")
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
1a83f4a7c1
commit
8e15aee621
@ -381,6 +381,7 @@ static void netdev_name_node_alt_flush(struct net_device *dev)
|
||||
/* Device list insertion */
|
||||
static void list_netdevice(struct net_device *dev)
|
||||
{
|
||||
struct netdev_name_node *name_node;
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
ASSERT_RTNL();
|
||||
@ -391,6 +392,10 @@ static void list_netdevice(struct net_device *dev)
|
||||
hlist_add_head_rcu(&dev->index_hlist,
|
||||
dev_index_hash(net, dev->ifindex));
|
||||
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 */
|
||||
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)
|
||||
*/
|
||||
static void unlist_netdevice(struct net_device *dev, bool lock)
|
||||
{
|
||||
struct netdev_name_node *name_node;
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
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 */
|
||||
if (lock)
|
||||
write_lock(&dev_base_lock);
|
||||
@ -10942,7 +10951,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
|
||||
synchronize_net();
|
||||
|
||||
list_for_each_entry(dev, head, unreg_list) {
|
||||
struct netdev_name_node *name_node;
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
/* Shutdown queueing discipline. */
|
||||
@ -10970,9 +10978,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
|
||||
dev_uc_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_free(dev->name_node);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user