@@ -940,6 +940,18 @@ struct net_device *dev_get_by_napi_id(unsigned int napi_id)
940
940
}
941
941
EXPORT_SYMBOL (dev_get_by_napi_id );
942
942
943
+ static DEFINE_SEQLOCK (netdev_rename_lock );
944
+
945
+ void netdev_copy_name (struct net_device * dev , char * name )
946
+ {
947
+ unsigned int seq ;
948
+
949
+ do {
950
+ seq = read_seqbegin (& netdev_rename_lock );
951
+ strscpy (name , dev -> name , IFNAMSIZ );
952
+ } while (read_seqretry (& netdev_rename_lock , seq ));
953
+ }
954
+
943
955
/**
944
956
* netdev_get_name - get a netdevice name, knowing its ifindex.
945
957
* @net: network namespace
@@ -951,7 +963,6 @@ int netdev_get_name(struct net *net, char *name, int ifindex)
951
963
struct net_device * dev ;
952
964
int ret ;
953
965
954
- down_read (& devnet_rename_sem );
955
966
rcu_read_lock ();
956
967
957
968
dev = dev_get_by_index_rcu (net , ifindex );
@@ -960,12 +971,11 @@ int netdev_get_name(struct net *net, char *name, int ifindex)
960
971
goto out ;
961
972
}
962
973
963
- strcpy ( name , dev -> name );
974
+ netdev_copy_name ( dev , name );
964
975
965
976
ret = 0 ;
966
977
out :
967
978
rcu_read_unlock ();
968
- up_read (& devnet_rename_sem );
969
979
return ret ;
970
980
}
971
981
@@ -1217,7 +1227,10 @@ int dev_change_name(struct net_device *dev, const char *newname)
1217
1227
1218
1228
memcpy (oldname , dev -> name , IFNAMSIZ );
1219
1229
1230
+ write_seqlock (& netdev_rename_lock );
1220
1231
err = dev_get_valid_name (net , dev , newname );
1232
+ write_sequnlock (& netdev_rename_lock );
1233
+
1221
1234
if (err < 0 ) {
1222
1235
up_write (& devnet_rename_sem );
1223
1236
return err ;
@@ -1257,7 +1270,9 @@ int dev_change_name(struct net_device *dev, const char *newname)
1257
1270
if (err >= 0 ) {
1258
1271
err = ret ;
1259
1272
down_write (& devnet_rename_sem );
1273
+ write_seqlock (& netdev_rename_lock );
1260
1274
memcpy (dev -> name , oldname , IFNAMSIZ );
1275
+ write_sequnlock (& netdev_rename_lock );
1261
1276
memcpy (oldname , newname , IFNAMSIZ );
1262
1277
WRITE_ONCE (dev -> name_assign_type , old_assign_type );
1263
1278
old_assign_type = NET_NAME_RENAMED ;
@@ -11403,8 +11418,12 @@ int __dev_change_net_namespace(struct net_device *dev, struct net *net,
11403
11418
dev_net_set (dev , net );
11404
11419
dev -> ifindex = new_ifindex ;
11405
11420
11406
- if (new_name [0 ]) /* Rename the netdev to prepared name */
11421
+ if (new_name [0 ]) {
11422
+ /* Rename the netdev to prepared name */
11423
+ write_seqlock (& netdev_rename_lock );
11407
11424
strscpy (dev -> name , new_name , IFNAMSIZ );
11425
+ write_sequnlock (& netdev_rename_lock );
11426
+ }
11408
11427
11409
11428
/* Fixup kobjects */
11410
11429
dev_set_uevent_suppress (& dev -> dev , 1 );
0 commit comments