From patchwork Mon Mar 2 16:04:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Bader X-Patchwork-Id: 445325 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id C8E301400A0; Tue, 3 Mar 2015 03:05:03 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1YSSq3-0001At-HF; Mon, 02 Mar 2015 16:04:59 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1YSSpr-000198-JG for kernel-team@lists.ubuntu.com; Mon, 02 Mar 2015 16:04:47 +0000 Received: from 1.general.smb.uk.vpn ([10.172.193.28] helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1YSSpr-0007kX-F4 for kernel-team@lists.ubuntu.com; Mon, 02 Mar 2015 16:04:47 +0000 From: Stefan Bader To: kernel-team@lists.ubuntu.com Subject: [PATCH 3/3] net: rename sysfs symlinks on device name change Date: Mon, 2 Mar 2015 17:04:44 +0100 Message-Id: <1425312284-18845-4-git-send-email-stefan.bader@canonical.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1425312284-18845-1-git-send-email-stefan.bader@canonical.com> References: <1425312284-18845-1-git-send-email-stefan.bader@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Veaceslav Falico Currently, we don't rename the upper/lower_ifc symlinks in /sys/class/net/*/ , which might result stale/duplicate links/names. Fix this by adding netdev_adjacent_rename_links(dev, oldname) which renames all the upper/lower interface's links to dev from the upper/lower_oldname to the new name. We don't need a rollback because only we control these symlinks and if we fail to rename them - sysfs will anyway complain. Reported-by: Ding Tianhong CC: Ding Tianhong CC: "David S. Miller" CC: Eric Dumazet CC: Nicolas Dichtel CC: Cong Wang Signed-off-by: Veaceslav Falico Signed-off-by: David S. Miller BugLink: http://bugs.launchpad.net/bugs/1410852 (backported from commit 5bb025fae53889cc99a21058c5dd369bf8cce820 upstream) Signed-off-by: Stefan Bader Acked-by: Andy Whitcroft --- include/linux/netdevice.h | 1 + net/core/dev.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index c46b3b2..caa5563 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -2937,6 +2937,7 @@ int netdev_master_upper_dev_link_private(struct net_device *dev, void *private); void netdev_upper_dev_unlink(struct net_device *dev, struct net_device *upper_dev); +void netdev_adjacent_rename_links(struct net_device *dev, char *oldname); void *netdev_lower_dev_get_private_rcu(struct net_device *dev, struct net_device *lower_dev); void *netdev_lower_dev_get_private(struct net_device *dev, diff --git a/net/core/dev.c b/net/core/dev.c index 588548c..0974a0f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1118,6 +1118,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); @@ -1137,6 +1139,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", @@ -5039,6 +5042,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_rcu(struct net_device *dev, struct net_device *lower_dev) { @@ -5069,7 +5091,6 @@ void *netdev_lower_dev_get_private(struct net_device *dev, } EXPORT_SYMBOL(netdev_lower_dev_get_private); - int dev_get_nest_level(struct net_device *dev, bool (*type_check)(struct net_device *dev)) {