Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'netdev_sysfs_symlink_rename'

Veaceslav Falico says:

====================
net: rename device's sysfs symlinks on name change

First patch only adds helper functions and cleans up the code a bit, second
one already does the renaming.

v1->v2:
Don't export the function, as it's used only in dev.c.
====================

Reported-by: Ding Tianhong <dingtianhong@huawei.com>
CC: Ding Tianhong <dingtianhong@huawei.com>
CC: "David S. Miller" <davem@davemloft.net>
CC: Eric Dumazet <edumazet@google.com>
CC: Nicolas Dichtel <nicolas.dichtel@6wind.com>
CC: Cong Wang <amwang@redhat.com>
CC: netdev@vger.kernel.org
Signed-off-by: Veaceslav Falico <vfalico@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

+53 -27
+1
include/linux/netdevice.h
··· 2941 2941 void *private); 2942 2942 void netdev_upper_dev_unlink(struct net_device *dev, 2943 2943 struct net_device *upper_dev); 2944 + void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); 2944 2945 void *netdev_lower_dev_get_private(struct net_device *dev, 2945 2946 struct net_device *lower_dev); 2946 2947 int skb_checksum_help(struct sk_buff *skb);
+52 -27
net/core/dev.c
··· 1119 1119 1120 1120 write_seqcount_end(&devnet_rename_seq); 1121 1121 1122 + netdev_adjacent_rename_links(dev, oldname); 1123 + 1122 1124 write_lock_bh(&dev_base_lock); 1123 1125 hlist_del_rcu(&dev->name_hlist); 1124 1126 write_unlock_bh(&dev_base_lock); ··· 1140 1138 err = ret; 1141 1139 write_seqcount_begin(&devnet_rename_seq); 1142 1140 memcpy(dev->name, oldname, IFNAMSIZ); 1141 + memcpy(oldname, newname, IFNAMSIZ); 1143 1142 goto rollback; 1144 1143 } else { 1145 1144 pr_err("%s: name change rollback failed: %d\n", ··· 4626 4623 } 4627 4624 EXPORT_SYMBOL(netdev_master_upper_dev_get_rcu); 4628 4625 4626 + int netdev_adjacent_sysfs_add(struct net_device *dev, 4627 + struct net_device *adj_dev, 4628 + struct list_head *dev_list) 4629 + { 4630 + char linkname[IFNAMSIZ+7]; 4631 + sprintf(linkname, dev_list == &dev->adj_list.upper ? 4632 + "upper_%s" : "lower_%s", adj_dev->name); 4633 + return sysfs_create_link(&(dev->dev.kobj), &(adj_dev->dev.kobj), 4634 + linkname); 4635 + } 4636 + void netdev_adjacent_sysfs_del(struct net_device *dev, 4637 + char *name, 4638 + struct list_head *dev_list) 4639 + { 4640 + char linkname[IFNAMSIZ+7]; 4641 + sprintf(linkname, dev_list == &dev->adj_list.upper ? 4642 + "upper_%s" : "lower_%s", name); 4643 + sysfs_remove_link(&(dev->dev.kobj), linkname); 4644 + } 4645 + 4646 + #define netdev_adjacent_is_neigh_list(dev, dev_list) \ 4647 + (dev_list == &dev->adj_list.upper || \ 4648 + dev_list == &dev->adj_list.lower) 4649 + 4629 4650 static int __netdev_adjacent_dev_insert(struct net_device *dev, 4630 4651 struct net_device *adj_dev, 4631 4652 struct list_head *dev_list, 4632 4653 void *private, bool master) 4633 4654 { 4634 4655 struct netdev_adjacent *adj; 4635 - char linkname[IFNAMSIZ+7]; 4636 4656 int ret; 4637 4657 4638 4658 adj = __netdev_find_adj(dev, adj_dev, dev_list); ··· 4678 4652 pr_debug("dev_hold for %s, because of link added from %s to %s\n", 4679 4653 adj_dev->name, dev->name, adj_dev->name); 4680 4654 4681 - if (dev_list == &dev->adj_list.lower) { 4682 - sprintf(linkname, "lower_%s", adj_dev->name); 4683 - ret = sysfs_create_link(&(dev->dev.kobj), 4684 - &(adj_dev->dev.kobj), linkname); 4685 - if (ret) 4686 - goto free_adj; 4687 - } else if (dev_list == &dev->adj_list.upper) { 4688 - sprintf(linkname, "upper_%s", adj_dev->name); 4689 - ret = sysfs_create_link(&(dev->dev.kobj), 4690 - &(adj_dev->dev.kobj), linkname); 4655 + if (netdev_adjacent_is_neigh_list(dev, dev_list)) { 4656 + ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); 4691 4657 if (ret) 4692 4658 goto free_adj; 4693 4659 } ··· 4699 4681 return 0; 4700 4682 4701 4683 remove_symlinks: 4702 - if (dev_list == &dev->adj_list.lower) { 4703 - sprintf(linkname, "lower_%s", adj_dev->name); 4704 - sysfs_remove_link(&(dev->dev.kobj), linkname); 4705 - } else if (dev_list == &dev->adj_list.upper) { 4706 - sprintf(linkname, "upper_%s", adj_dev->name); 4707 - sysfs_remove_link(&(dev->dev.kobj), linkname); 4708 - } 4709 - 4684 + if (netdev_adjacent_is_neigh_list(dev, dev_list)) 4685 + netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); 4710 4686 free_adj: 4711 4687 kfree(adj); 4712 4688 dev_put(adj_dev); ··· 4713 4701 struct list_head *dev_list) 4714 4702 { 4715 4703 struct netdev_adjacent *adj; 4716 - char linkname[IFNAMSIZ+7]; 4717 4704 4718 4705 adj = __netdev_find_adj(dev, adj_dev, dev_list); 4719 4706 ··· 4732 4721 if (adj->master) 4733 4722 sysfs_remove_link(&(dev->dev.kobj), "master"); 4734 4723 4735 - if (dev_list == &dev->adj_list.lower) { 4736 - sprintf(linkname, "lower_%s", adj_dev->name); 4737 - sysfs_remove_link(&(dev->dev.kobj), linkname); 4738 - } else if (dev_list == &dev->adj_list.upper) { 4739 - sprintf(linkname, "upper_%s", adj_dev->name); 4740 - sysfs_remove_link(&(dev->dev.kobj), linkname); 4741 - } 4724 + if (netdev_adjacent_is_neigh_list(dev, dev_list)) 4725 + netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); 4742 4726 4743 4727 list_del_rcu(&adj->list); 4744 4728 pr_debug("dev_put for %s, because link removed from %s to %s\n", ··· 5001 4995 call_netdevice_notifiers(NETDEV_CHANGEUPPER, dev); 5002 4996 } 5003 4997 EXPORT_SYMBOL(netdev_upper_dev_unlink); 4998 + 4999 + void netdev_adjacent_rename_links(struct net_device *dev, char *oldname) 5000 + { 5001 + struct netdev_adjacent *iter; 5002 + 5003 + list_for_each_entry(iter, &dev->adj_list.upper, list) { 5004 + netdev_adjacent_sysfs_del(iter->dev, oldname, 5005 + &iter->dev->adj_list.lower); 5006 + netdev_adjacent_sysfs_add(iter->dev, dev, 5007 + &iter->dev->adj_list.lower); 5008 + } 5009 + 5010 + list_for_each_entry(iter, &dev->adj_list.lower, list) { 5011 + netdev_adjacent_sysfs_del(iter->dev, oldname, 5012 + &iter->dev->adj_list.upper); 5013 + netdev_adjacent_sysfs_add(iter->dev, dev, 5014 + &iter->dev->adj_list.upper); 5015 + } 5016 + } 5004 5017 5005 5018 void *netdev_lower_dev_get_private(struct net_device *dev, 5006 5019 struct net_device *lower_dev)