@@ -345,7 +345,6 @@ int netdev_name_node_alt_create(struct net_device *dev, const char *name)
345
345
static void __netdev_name_node_alt_destroy (struct netdev_name_node * name_node )
346
346
{
347
347
list_del (& name_node -> list );
348
- netdev_name_node_del (name_node );
349
348
kfree (name_node -> name );
350
349
netdev_name_node_free (name_node );
351
350
}
@@ -364,6 +363,8 @@ int netdev_name_node_alt_destroy(struct net_device *dev, const char *name)
364
363
if (name_node == dev -> name_node || name_node -> dev != dev )
365
364
return - EINVAL ;
366
365
366
+ netdev_name_node_del (name_node );
367
+ synchronize_rcu ();
367
368
__netdev_name_node_alt_destroy (name_node );
368
369
369
370
return 0 ;
@@ -380,6 +381,7 @@ static void netdev_name_node_alt_flush(struct net_device *dev)
380
381
/* Device list insertion */
381
382
static void list_netdevice (struct net_device * dev )
382
383
{
384
+ struct netdev_name_node * name_node ;
383
385
struct net * net = dev_net (dev );
384
386
385
387
ASSERT_RTNL ();
@@ -390,6 +392,10 @@ static void list_netdevice(struct net_device *dev)
390
392
hlist_add_head_rcu (& dev -> index_hlist ,
391
393
dev_index_hash (net , dev -> ifindex ));
392
394
write_unlock (& dev_base_lock );
395
+
396
+ netdev_for_each_altname (dev , name_node )
397
+ netdev_name_node_add (net , name_node );
398
+
393
399
/* We reserved the ifindex, this can't fail */
394
400
WARN_ON (xa_store (& net -> dev_by_index , dev -> ifindex , dev , GFP_KERNEL ));
395
401
@@ -401,12 +407,16 @@ static void list_netdevice(struct net_device *dev)
401
407
*/
402
408
static void unlist_netdevice (struct net_device * dev , bool lock )
403
409
{
410
+ struct netdev_name_node * name_node ;
404
411
struct net * net = dev_net (dev );
405
412
406
413
ASSERT_RTNL ();
407
414
408
415
xa_erase (& net -> dev_by_index , dev -> ifindex );
409
416
417
+ netdev_for_each_altname (dev , name_node )
418
+ netdev_name_node_del (name_node );
419
+
410
420
/* Unlink dev from the device chain */
411
421
if (lock )
412
422
write_lock (& dev_base_lock );
@@ -1086,7 +1096,8 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf)
1086
1096
1087
1097
for_each_netdev (net , d ) {
1088
1098
struct netdev_name_node * name_node ;
1089
- list_for_each_entry (name_node , & d -> name_node -> list , list ) {
1099
+
1100
+ netdev_for_each_altname (d , name_node ) {
1090
1101
if (!sscanf (name_node -> name , name , & i ))
1091
1102
continue ;
1092
1103
if (i < 0 || i >= max_netdevices )
@@ -1123,6 +1134,26 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf)
1123
1134
return - ENFILE ;
1124
1135
}
1125
1136
1137
+ static int dev_prep_valid_name (struct net * net , struct net_device * dev ,
1138
+ const char * want_name , char * out_name )
1139
+ {
1140
+ int ret ;
1141
+
1142
+ if (!dev_valid_name (want_name ))
1143
+ return - EINVAL ;
1144
+
1145
+ if (strchr (want_name , '%' )) {
1146
+ ret = __dev_alloc_name (net , want_name , out_name );
1147
+ return ret < 0 ? ret : 0 ;
1148
+ } else if (netdev_name_in_use (net , want_name )) {
1149
+ return - EEXIST ;
1150
+ } else if (out_name != want_name ) {
1151
+ strscpy (out_name , want_name , IFNAMSIZ );
1152
+ }
1153
+
1154
+ return 0 ;
1155
+ }
1156
+
1126
1157
static int dev_alloc_name_ns (struct net * net ,
1127
1158
struct net_device * dev ,
1128
1159
const char * name )
@@ -1160,19 +1191,13 @@ EXPORT_SYMBOL(dev_alloc_name);
1160
1191
static int dev_get_valid_name (struct net * net , struct net_device * dev ,
1161
1192
const char * name )
1162
1193
{
1163
- BUG_ON (!net );
1164
-
1165
- if (!dev_valid_name (name ))
1166
- return - EINVAL ;
1167
-
1168
- if (strchr (name , '%' ))
1169
- return dev_alloc_name_ns (net , dev , name );
1170
- else if (netdev_name_in_use (net , name ))
1171
- return - EEXIST ;
1172
- else if (dev -> name != name )
1173
- strscpy (dev -> name , name , IFNAMSIZ );
1194
+ char buf [IFNAMSIZ ];
1195
+ int ret ;
1174
1196
1175
- return 0 ;
1197
+ ret = dev_prep_valid_name (net , dev , name , buf );
1198
+ if (ret >= 0 )
1199
+ strscpy (dev -> name , buf , IFNAMSIZ );
1200
+ return ret ;
1176
1201
}
1177
1202
1178
1203
/**
@@ -11037,7 +11062,9 @@ EXPORT_SYMBOL(unregister_netdev);
11037
11062
int __dev_change_net_namespace (struct net_device * dev , struct net * net ,
11038
11063
const char * pat , int new_ifindex )
11039
11064
{
11065
+ struct netdev_name_node * name_node ;
11040
11066
struct net * net_old = dev_net (dev );
11067
+ char new_name [IFNAMSIZ ] = {};
11041
11068
int err , new_nsid ;
11042
11069
11043
11070
ASSERT_RTNL ();
@@ -11064,10 +11091,15 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
11064
11091
/* We get here if we can't use the current device name */
11065
11092
if (!pat )
11066
11093
goto out ;
11067
- err = dev_get_valid_name (net , dev , pat );
11094
+ err = dev_prep_valid_name (net , dev , pat , new_name );
11068
11095
if (err < 0 )
11069
11096
goto out ;
11070
11097
}
11098
+ /* Check that none of the altnames conflicts. */
11099
+ err = - EEXIST ;
11100
+ netdev_for_each_altname (dev , name_node )
11101
+ if (netdev_name_in_use (net , name_node -> name ))
11102
+ goto out ;
11071
11103
11072
11104
/* Check that new_ifindex isn't used yet. */
11073
11105
if (new_ifindex ) {
@@ -11135,6 +11167,9 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
11135
11167
kobject_uevent (& dev -> dev .kobj , KOBJ_ADD );
11136
11168
netdev_adjacent_add_links (dev );
11137
11169
11170
+ if (new_name [0 ]) /* Rename the netdev to prepared name */
11171
+ strscpy (dev -> name , new_name , IFNAMSIZ );
11172
+
11138
11173
/* Fixup kobjects */
11139
11174
err = device_rename (& dev -> dev , dev -> name );
11140
11175
WARN_ON (err );
0 commit comments