| From: Sven Eckelmann <sven@narfation.org> |
| Date: Fri, 1 Jun 2018 19:24:23 +0200 |
| Subject: batman-adv: Fix debugfs path for renamed hardif |
| |
| commit 36dc621ceca1be3ec885aeade5fdafbbcc452a6d upstream. |
| |
| batman-adv is creating special debugfs directories in the init |
| net_namespace for each valid hard-interface (net_device). But it is |
| possible to rename a net_device to a completely different name then the |
| original one. |
| |
| It can therefore happen that a user registers a new net_device which gets |
| the name "wlan0" assigned by default. batman-adv is also adding a new |
| directory under $debugfs/batman-adv/ with the name "wlan0". |
| |
| The user then decides to rename this device to "wl_pri" and registers a |
| different device. The kernel may now decide to use the name "wlan0" again |
| for this new device. batman-adv will detect it as a valid net_device and |
| tries to create a directory with the name "wlan0" under |
| $debugfs/batman-adv/. But there already exists one with this name under |
| this path and thus this fails. batman-adv will detect a problem and |
| rollback the registering of this device. |
| |
| batman-adv must therefore take care of renaming the debugfs directories |
| for hard-interfaces whenever it detects such a net_device rename. |
| |
| Fixes: 5bc7c1eb44f2 ("batman-adv: add debugfs structure for information per interface") |
| Reported-by: John Soros <sorosj@gmail.com> |
| Signed-off-by: Sven Eckelmann <sven@narfation.org> |
| Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| net/batman-adv/debugfs.c | 20 ++++++++++++++++++++ |
| net/batman-adv/debugfs.h | 6 ++++++ |
| net/batman-adv/hard-interface.c | 3 +++ |
| 3 files changed, 29 insertions(+) |
| |
| --- a/net/batman-adv/debugfs.c |
| +++ b/net/batman-adv/debugfs.c |
| @@ -17,6 +17,7 @@ |
| |
| #include "main.h" |
| |
| +#include <linux/dcache.h> |
| #include <linux/debugfs.h> |
| |
| #include "debugfs.h" |
| @@ -486,6 +487,25 @@ out: |
| } |
| |
| /** |
| + * batadv_debugfs_rename_hardif() - Fix debugfs path for renamed hardif |
| + * @hard_iface: hard interface which was renamed |
| + */ |
| +void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface) |
| +{ |
| + const char *name = hard_iface->net_dev->name; |
| + struct dentry *dir; |
| + struct dentry *d; |
| + |
| + dir = hard_iface->debug_dir; |
| + if (!dir) |
| + return; |
| + |
| + d = debugfs_rename(dir->d_parent, dir, dir->d_parent, name); |
| + if (!d) |
| + pr_err("Can't rename debugfs dir to %s\n", name); |
| +} |
| + |
| +/** |
| * batadv_debugfs_del_hardif - delete the base directory for a hard interface |
| * in debugfs. |
| * @hard_iface: hard interface which is deleted. |
| --- a/net/batman-adv/debugfs.h |
| +++ b/net/batman-adv/debugfs.h |
| @@ -27,6 +27,7 @@ void batadv_debugfs_destroy(void); |
| int batadv_debugfs_add_meshif(struct net_device *dev); |
| void batadv_debugfs_del_meshif(struct net_device *dev); |
| int batadv_debugfs_add_hardif(struct batadv_hard_iface *hard_iface); |
| +void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface); |
| void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface); |
| |
| #else |
| @@ -55,6 +56,11 @@ int batadv_debugfs_add_hardif(struct bat |
| } |
| |
| static inline |
| +void batadv_debugfs_rename_hardif(struct batadv_hard_iface *hard_iface) |
| +{ |
| +} |
| + |
| +static inline |
| void batadv_debugfs_del_hardif(struct batadv_hard_iface *hard_iface) |
| { |
| } |
| --- a/net/batman-adv/hard-interface.c |
| +++ b/net/batman-adv/hard-interface.c |
| @@ -695,6 +695,9 @@ static int batadv_hard_if_event(struct n |
| if (hard_iface == primary_if) |
| batadv_primary_if_update_addr(bat_priv, NULL); |
| break; |
| + case NETDEV_CHANGENAME: |
| + batadv_debugfs_rename_hardif(hard_iface); |
| + break; |
| default: |
| break; |
| } |