* [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change
@ 2014-01-14 20:58 Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 1/2] net: add sysfs helpers for netdev_adjacent logic Veaceslav Falico
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Veaceslav Falico @ 2014-01-14 20:58 UTC (permalink / raw)
To: netdev
Cc: Ding Tianhong, David S. Miller, Eric Dumazet, Nicolas Dichtel,
Cong Wang, Veaceslav Falico
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>
---
include/linux/netdevice.h | 1 +
net/core/dev.c | 80 +++++++++++++++++++++++++++++++----------------
2 files changed, 54 insertions(+), 27 deletions(-)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 net-next 1/2] net: add sysfs helpers for netdev_adjacent logic
2014-01-14 20:58 [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change Veaceslav Falico
@ 2014-01-14 20:58 ` Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change Veaceslav Falico
2014-01-15 23:17 ` [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on " David Miller
2 siblings, 0 replies; 7+ messages in thread
From: Veaceslav Falico @ 2014-01-14 20:58 UTC (permalink / raw)
To: netdev
Cc: Veaceslav Falico, Ding Tianhong, David S. Miller, Eric Dumazet,
Nicolas Dichtel, Cong Wang
They clean up the code a bit and can be used further.
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>
---
net/core/dev.c | 57 ++++++++++++++++++++++++++++++---------------------------
1 file changed, 30 insertions(+), 27 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 87312dc..c578d4e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4595,13 +4595,36 @@ struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev)
}
EXPORT_SYMBOL(netdev_master_upper_dev_get_rcu);
+int netdev_adjacent_sysfs_add(struct net_device *dev,
+ struct net_device *adj_dev,
+ struct list_head *dev_list)
+{
+ char linkname[IFNAMSIZ+7];
+ sprintf(linkname, dev_list == &dev->adj_list.upper ?
+ "upper_%s" : "lower_%s", adj_dev->name);
+ return sysfs_create_link(&(dev->dev.kobj), &(adj_dev->dev.kobj),
+ linkname);
+}
+void netdev_adjacent_sysfs_del(struct net_device *dev,
+ char *name,
+ struct list_head *dev_list)
+{
+ char linkname[IFNAMSIZ+7];
+ sprintf(linkname, dev_list == &dev->adj_list.upper ?
+ "upper_%s" : "lower_%s", name);
+ sysfs_remove_link(&(dev->dev.kobj), linkname);
+}
+
+#define netdev_adjacent_is_neigh_list(dev, dev_list) \
+ (dev_list == &dev->adj_list.upper || \
+ dev_list == &dev->adj_list.lower)
+
static int __netdev_adjacent_dev_insert(struct net_device *dev,
struct net_device *adj_dev,
struct list_head *dev_list,
void *private, bool master)
{
struct netdev_adjacent *adj;
- char linkname[IFNAMSIZ+7];
int ret;
adj = __netdev_find_adj(dev, adj_dev, dev_list);
@@ -4624,16 +4647,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
pr_debug("dev_hold for %s, because of link added from %s to %s\n",
adj_dev->name, dev->name, adj_dev->name);
- if (dev_list == &dev->adj_list.lower) {
- sprintf(linkname, "lower_%s", adj_dev->name);
- ret = sysfs_create_link(&(dev->dev.kobj),
- &(adj_dev->dev.kobj), linkname);
- if (ret)
- goto free_adj;
- } else if (dev_list == &dev->adj_list.upper) {
- sprintf(linkname, "upper_%s", adj_dev->name);
- ret = sysfs_create_link(&(dev->dev.kobj),
- &(adj_dev->dev.kobj), linkname);
+ if (netdev_adjacent_is_neigh_list(dev, dev_list)) {
+ ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list);
if (ret)
goto free_adj;
}
@@ -4653,14 +4668,8 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev,
return 0;
remove_symlinks:
- if (dev_list == &dev->adj_list.lower) {
- sprintf(linkname, "lower_%s", adj_dev->name);
- sysfs_remove_link(&(dev->dev.kobj), linkname);
- } else if (dev_list == &dev->adj_list.upper) {
- sprintf(linkname, "upper_%s", adj_dev->name);
- sysfs_remove_link(&(dev->dev.kobj), linkname);
- }
-
+ if (netdev_adjacent_is_neigh_list(dev, dev_list))
+ netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
free_adj:
kfree(adj);
dev_put(adj_dev);
@@ -4673,7 +4682,6 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
struct list_head *dev_list)
{
struct netdev_adjacent *adj;
- char linkname[IFNAMSIZ+7];
adj = __netdev_find_adj(dev, adj_dev, dev_list);
@@ -4693,13 +4701,8 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev,
if (adj->master)
sysfs_remove_link(&(dev->dev.kobj), "master");
- if (dev_list == &dev->adj_list.lower) {
- sprintf(linkname, "lower_%s", adj_dev->name);
- sysfs_remove_link(&(dev->dev.kobj), linkname);
- } else if (dev_list == &dev->adj_list.upper) {
- sprintf(linkname, "upper_%s", adj_dev->name);
- sysfs_remove_link(&(dev->dev.kobj), linkname);
- }
+ if (netdev_adjacent_is_neigh_list(dev, dev_list))
+ netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list);
list_del_rcu(&adj->list);
pr_debug("dev_put for %s, because link removed from %s to %s\n",
--
1.8.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change
2014-01-14 20:58 [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 1/2] net: add sysfs helpers for netdev_adjacent logic Veaceslav Falico
@ 2014-01-14 20:58 ` Veaceslav Falico
2014-01-15 2:50 ` Ding Tianhong
2014-01-15 23:17 ` [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on " David Miller
2 siblings, 1 reply; 7+ messages in thread
From: Veaceslav Falico @ 2014-01-14 20:58 UTC (permalink / raw)
To: netdev
Cc: Veaceslav Falico, Ding Tianhong, David S. Miller, Eric Dumazet,
Nicolas Dichtel, Cong Wang
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>
---
Notes:
v1->v2:
Don't export netdev_adjacent_rename_links() - it's only used in dev.c
include/linux/netdevice.h | 1 +
net/core/dev.c | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index a2a70cc..61f8338 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(struct net_device *dev,
struct net_device *lower_dev);
int skb_checksum_help(struct sk_buff *skb);
diff --git a/net/core/dev.c b/net/core/dev.c
index c578d4e..d4f08c8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1117,6 +1117,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);
@@ -1136,6 +1138,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",
@@ -4971,6 +4974,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)
{
--
1.8.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change
2014-01-14 20:58 ` [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change Veaceslav Falico
@ 2014-01-15 2:50 ` Ding Tianhong
2014-01-15 2:59 ` Veaceslav Falico
0 siblings, 1 reply; 7+ messages in thread
From: Ding Tianhong @ 2014-01-15 2:50 UTC (permalink / raw)
To: Veaceslav Falico, netdev
Cc: David S. Miller, Eric Dumazet, Nicolas Dichtel, Cong Wang
On 2014/1/15 4:58, Veaceslav Falico wrote:
> 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>
> ---
>
> Notes:
> v1->v2:
> Don't export netdev_adjacent_rename_links() - it's only used in dev.c
>
> include/linux/netdevice.h | 1 +
> net/core/dev.c | 22 ++++++++++++++++++++++
> 2 files changed, 23 insertions(+)
>
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index a2a70cc..61f8338 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(struct net_device *dev,
> struct net_device *lower_dev);
> int skb_checksum_help(struct sk_buff *skb);
> diff --git a/net/core/dev.c b/net/core/dev.c
> index c578d4e..d4f08c8 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -1117,6 +1117,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);
> @@ -1136,6 +1138,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",
> @@ -4971,6 +4974,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);
> + }
> +}
> +
why no all_adj_list, only adj_list?
I think you have add the dev to the upper_dev's upper_dev by all_adj_list, and lower_dev, so you have to check them.
Regards
Ding
> void *netdev_lower_dev_get_private(struct net_device *dev,
> struct net_device *lower_dev)
> {
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change
2014-01-15 2:50 ` Ding Tianhong
@ 2014-01-15 2:59 ` Veaceslav Falico
2014-01-15 3:09 ` Ding Tianhong
0 siblings, 1 reply; 7+ messages in thread
From: Veaceslav Falico @ 2014-01-15 2:59 UTC (permalink / raw)
To: Ding Tianhong
Cc: netdev, David S. Miller, Eric Dumazet, Nicolas Dichtel, Cong Wang
On Wed, Jan 15, 2014 at 10:50:30AM +0800, Ding Tianhong wrote:
>On 2014/1/15 4:58, Veaceslav Falico wrote:
...snip...
>> +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);
>> + }
>> +}
>> +
>
>why no all_adj_list, only adj_list?
>
>I think you have add the dev to the upper_dev's upper_dev by all_adj_list, and lower_dev, so you have to check them.
symlinks are created only for neighbour adjacent devices, which are in
adj_list.*, and are not created for all_adj_list.* devices, which contains
a 'full view' list of all adjacent devices.
>
>Regards
>Ding
>
>> void *netdev_lower_dev_get_private(struct net_device *dev,
>> struct net_device *lower_dev)
>> {
>>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change
2014-01-15 2:59 ` Veaceslav Falico
@ 2014-01-15 3:09 ` Ding Tianhong
0 siblings, 0 replies; 7+ messages in thread
From: Ding Tianhong @ 2014-01-15 3:09 UTC (permalink / raw)
To: Veaceslav Falico
Cc: netdev, David S. Miller, Eric Dumazet, Nicolas Dichtel, Cong Wang
On 2014/1/15 10:59, Veaceslav Falico wrote:
> On Wed, Jan 15, 2014 at 10:50:30AM +0800, Ding Tianhong wrote:
>> On 2014/1/15 4:58, Veaceslav Falico wrote:
> ...snip...
>>> +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);
>>> + }
>>> +}
>>> +
>>
>> why no all_adj_list, only adj_list?
>>
>> I think you have add the dev to the upper_dev's upper_dev by all_adj_list, and lower_dev, so you have to check them.
>
> symlinks are created only for neighbour adjacent devices, which are in
> adj_list.*, and are not created for all_adj_list.* devices, which contains
> a 'full view' list of all adjacent devices.
>
Yes, it return when found adj, I miss it.
>>
>> Regards
>> Ding
>>
>>> void *netdev_lower_dev_get_private(struct net_device *dev,
>>> struct net_device *lower_dev)
>>> {
>>>
>>
>>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change
2014-01-14 20:58 [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 1/2] net: add sysfs helpers for netdev_adjacent logic Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change Veaceslav Falico
@ 2014-01-15 23:17 ` David Miller
2 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2014-01-15 23:17 UTC (permalink / raw)
To: vfalico; +Cc: netdev, dingtianhong, edumazet, nicolas.dichtel, amwang
From: Veaceslav Falico <vfalico@redhat.com>
Date: Tue, 14 Jan 2014 21:58:49 +0100
> 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>
Series applied, thanks Vaeceslav.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-01-15 23:17 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-14 20:58 [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on name change Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 1/2] net: add sysfs helpers for netdev_adjacent logic Veaceslav Falico
2014-01-14 20:58 ` [PATCH v2 net-next 2/2] net: rename sysfs symlinks on device name change Veaceslav Falico
2014-01-15 2:50 ` Ding Tianhong
2014-01-15 2:59 ` Veaceslav Falico
2014-01-15 3:09 ` Ding Tianhong
2014-01-15 23:17 ` [PATCH v2 net-next 0/2] net: rename device's sysfs symlinks on " David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).