|
@@ -1119,6 +1119,8 @@ rollback:
|
|
|
|
|
|
write_seqcount_end(&devnet_rename_seq);
|
|
|
|
|
|
+ netdev_adjacent_rename_links(dev, oldname);
|
|
|
+
|
|
|
write_lock_bh(&dev_base_lock);
|
|
|
hlist_del_rcu(&dev->name_hlist);
|
|
|
write_unlock_bh(&dev_base_lock);
|
|
@@ -1138,6 +1140,7 @@ rollback:
|
|
|
err = ret;
|
|
|
write_seqcount_begin(&devnet_rename_seq);
|
|
|
memcpy(dev->name, oldname, IFNAMSIZ);
|
|
|
+ memcpy(oldname, newname, IFNAMSIZ);
|
|
|
goto rollback;
|
|
|
} else {
|
|
|
pr_err("%s: name change rollback failed: %d\n",
|
|
@@ -4999,6 +5002,25 @@ void netdev_upper_dev_unlink(struct net_device *dev,
|
|
|
}
|
|
|
EXPORT_SYMBOL(netdev_upper_dev_unlink);
|
|
|
|
|
|
+void netdev_adjacent_rename_links(struct net_device *dev, char *oldname)
|
|
|
+{
|
|
|
+ struct netdev_adjacent *iter;
|
|
|
+
|
|
|
+ list_for_each_entry(iter, &dev->adj_list.upper, list) {
|
|
|
+ netdev_adjacent_sysfs_del(iter->dev, oldname,
|
|
|
+ &iter->dev->adj_list.lower);
|
|
|
+ netdev_adjacent_sysfs_add(iter->dev, dev,
|
|
|
+ &iter->dev->adj_list.lower);
|
|
|
+ }
|
|
|
+
|
|
|
+ list_for_each_entry(iter, &dev->adj_list.lower, list) {
|
|
|
+ netdev_adjacent_sysfs_del(iter->dev, oldname,
|
|
|
+ &iter->dev->adj_list.upper);
|
|
|
+ netdev_adjacent_sysfs_add(iter->dev, dev,
|
|
|
+ &iter->dev->adj_list.upper);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void *netdev_lower_dev_get_private(struct net_device *dev,
|
|
|
struct net_device *lower_dev)
|
|
|
{
|