hsr: add hsr root debugfs directory
authorTaehee Yoo <ap420073@gmail.com>
Sun, 22 Dec 2019 11:26:27 +0000 (11:26 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Dec 2019 00:35:35 +0000 (16:35 -0800)
In current hsr code, when hsr interface is created, it creates debugfs
directory /sys/kernel/debug/<interface name>.
If there is same directory or file name in there, it fails.
In order to reduce possibility of failure of creation of debugfs,
this patch adds root directory.

Test commands:
    ip link add dummy0 type dummy
    ip link add dummy1 type dummy
    ip link add hsr0 type hsr slave1 dummy0 slave2 dummy1

Before this patch:
    /sys/kernel/debug/hsr0/node_table

After this patch:
    /sys/kernel/debug/hsr/hsr0/node_table

Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/hsr/hsr_debugfs.c
net/hsr/hsr_main.c
net/hsr/hsr_main.h
net/hsr/hsr_netlink.c

index 6618a9d..a7462a7 100644 (file)
@@ -20,6 +20,8 @@
 #include "hsr_main.h"
 #include "hsr_framereg.h"
 
+static struct dentry *hsr_debugfs_root_dir;
+
 static void print_mac_address(struct seq_file *sfp, unsigned char *mac)
 {
        seq_printf(sfp, "%02x:%02x:%02x:%02x:%02x:%02x:",
@@ -81,9 +83,9 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev)
 {
        struct dentry *de = NULL;
 
-       de = debugfs_create_dir(hsr_dev->name, NULL);
+       de = debugfs_create_dir(hsr_dev->name, hsr_debugfs_root_dir);
        if (IS_ERR(de)) {
-               pr_err("Cannot create hsr debugfs root\n");
+               pr_err("Cannot create hsr debugfs directory\n");
                return;
        }
 
@@ -93,7 +95,7 @@ void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev)
                                 priv->node_tbl_root, priv,
                                 &hsr_fops);
        if (IS_ERR(de)) {
-               pr_err("Cannot create hsr node_table directory\n");
+               pr_err("Cannot create hsr node_table file\n");
                debugfs_remove(priv->node_tbl_root);
                priv->node_tbl_root = NULL;
                return;
@@ -115,3 +117,18 @@ hsr_debugfs_term(struct hsr_priv *priv)
        debugfs_remove(priv->node_tbl_root);
        priv->node_tbl_root = NULL;
 }
+
+void hsr_debugfs_create_root(void)
+{
+       hsr_debugfs_root_dir = debugfs_create_dir("hsr", NULL);
+       if (IS_ERR(hsr_debugfs_root_dir)) {
+               pr_err("Cannot create hsr debugfs root directory\n");
+               hsr_debugfs_root_dir = NULL;
+       }
+}
+
+void hsr_debugfs_remove_root(void)
+{
+       /* debugfs_remove() internally checks NULL and ERROR */
+       debugfs_remove(hsr_debugfs_root_dir);
+}
index b9988a6..4908963 100644 (file)
@@ -123,6 +123,7 @@ static void __exit hsr_exit(void)
 {
        unregister_netdevice_notifier(&hsr_nb);
        hsr_netlink_exit();
+       hsr_debugfs_remove_root();
 }
 
 module_init(hsr_init);
index acab9c3..55d2057 100644 (file)
@@ -186,12 +186,18 @@ static inline u16 hsr_get_skb_sequence_nr(struct sk_buff *skb)
 #if IS_ENABLED(CONFIG_DEBUG_FS)
 void hsr_debugfs_init(struct hsr_priv *priv, struct net_device *hsr_dev);
 void hsr_debugfs_term(struct hsr_priv *priv);
+void hsr_debugfs_create_root(void);
+void hsr_debugfs_remove_root(void);
 #else
 static inline void hsr_debugfs_init(struct hsr_priv *priv,
                                    struct net_device *hsr_dev)
 {}
 static inline void hsr_debugfs_term(struct hsr_priv *priv)
 {}
+static inline void hsr_debugfs_create_root(void)
+{}
+static inline void hsr_debugfs_remove_root(void)
+{}
 #endif
 
 #endif /*  __HSR_PRIVATE_H */
index 8f8337f..8dc0547 100644 (file)
@@ -476,6 +476,7 @@ int __init hsr_netlink_init(void)
        if (rc)
                goto fail_genl_register_family;
 
+       hsr_debugfs_create_root();
        return 0;
 
 fail_genl_register_family: