Message ID | 1425312284-18845-4-git-send-email-stefan.bader@canonical.com |
---|---|
State | New |
Headers | show |
On 02.03.2015 17:04, Stefan Bader wrote: > From: Veaceslav Falico <vfalico@redhat.com> > > 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 <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> > Signed-off-by: Veaceslav Falico <vfalico@redhat.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > > BugLink: http://bugs.launchpad.net/bugs/1410852 > > (backported from commit 5bb025fae53889cc99a21058c5dd369bf8cce820 upstream) > Signed-off-by: Stefan Bader <stefan.bader@canonical.com> > --- > 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) > { Darn, I failed to see below. The last part of removing the empty line also is only an accident... -Stefan > @@ -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)) > { >
On Mon, Mar 02, 2015 at 05:04:44PM +0100, Stefan Bader wrote: > From: Veaceslav Falico <vfalico@redhat.com> > > 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 <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> > Signed-off-by: Veaceslav Falico <vfalico@redhat.com> > Signed-off-by: David S. Miller <davem@davemloft.net> > > BugLink: http://bugs.launchpad.net/bugs/1410852 > > (backported from commit 5bb025fae53889cc99a21058c5dd369bf8cce820 upstream) > Signed-off-by: Stefan Bader <stefan.bader@canonical.com> > --- > 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); > > - Erp. > int dev_get_nest_level(struct net_device *dev, > bool (*type_check)(struct net_device *dev)) > { Other than the blank line which should be elided, this looks to be as near as dammit a cherry-pick too. Looks to do what is claimed and is easy to test. Acked-by: Andy Whitcroft <apw@canonical.com> -apw
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)) {