wl12xx: remove redundant debugfs_remove_recursive() call
authorEliad Peller <eliad@wizery.com>
Wed, 15 Dec 2010 09:47:54 +0000 (11:47 +0200)
committerLuciano Coelho <coelho@ti.com>
Mon, 24 Jan 2011 20:11:45 +0000 (22:11 +0200)
Upon rmmod, the <debugfs>/ieee80211/phyX dir is being removed.
later, we try to remove <debugfs>/ieee80211/phyX/wl12xx, which
might result in NULL dereference.

Remove the excessive debugfs_remove_recursive() call.
(consequently, there is no more need to save wl->rootdir)

Reported-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
drivers/net/wireless/wl12xx/debugfs.c
drivers/net/wireless/wl12xx/wl12xx.h

index ec6077760157bc7e6ddc2a6d4dffbcce99a371f4..36e7ec1e0c3ba350ba2e86cb6156e2879c5f77f8 100644 (file)
@@ -293,12 +293,13 @@ static const struct file_operations gpio_power_ops = {
        .llseek = default_llseek,
 };
 
-static int wl1271_debugfs_add_files(struct wl1271 *wl)
+static int wl1271_debugfs_add_files(struct wl1271 *wl,
+                                    struct dentry *rootdir)
 {
        int ret = 0;
        struct dentry *entry, *stats;
 
-       stats = debugfs_create_dir("fw-statistics", wl->rootdir);
+       stats = debugfs_create_dir("fw-statistics", rootdir);
        if (!stats || IS_ERR(stats)) {
                entry = stats;
                goto err;
@@ -395,13 +396,13 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl)
        DEBUGFS_FWSTATS_ADD(rxpipe, missed_beacon_host_int_trig_rx_data);
        DEBUGFS_FWSTATS_ADD(rxpipe, tx_xfr_host_int_trig_rx_data);
 
-       DEBUGFS_ADD(tx_queue_len, wl->rootdir);
-       DEBUGFS_ADD(retry_count, wl->rootdir);
-       DEBUGFS_ADD(excessive_retries, wl->rootdir);
+       DEBUGFS_ADD(tx_queue_len, rootdir);
+       DEBUGFS_ADD(retry_count, rootdir);
+       DEBUGFS_ADD(excessive_retries, rootdir);
 
-       DEBUGFS_ADD(gpio_power, wl->rootdir);
+       DEBUGFS_ADD(gpio_power, rootdir);
 
-       entry = debugfs_create_x32("debug_level", 0600, wl->rootdir,
+       entry = debugfs_create_x32("debug_level", 0600, rootdir,
                                   &wl12xx_debug_level);
        if (!entry || IS_ERR(entry))
                goto err;
@@ -419,7 +420,7 @@ err:
 
 void wl1271_debugfs_reset(struct wl1271 *wl)
 {
-       if (!wl->rootdir)
+       if (!wl->stats.fw_stats)
                return;
 
        memset(wl->stats.fw_stats, 0, sizeof(*wl->stats.fw_stats));
@@ -430,13 +431,13 @@ void wl1271_debugfs_reset(struct wl1271 *wl)
 int wl1271_debugfs_init(struct wl1271 *wl)
 {
        int ret;
+       struct dentry *rootdir;
 
-       wl->rootdir = debugfs_create_dir(KBUILD_MODNAME,
-                                        wl->hw->wiphy->debugfsdir);
+       rootdir = debugfs_create_dir(KBUILD_MODNAME,
+                                    wl->hw->wiphy->debugfsdir);
 
-       if (IS_ERR(wl->rootdir)) {
-               ret = PTR_ERR(wl->rootdir);
-               wl->rootdir = NULL;
+       if (IS_ERR(rootdir)) {
+               ret = PTR_ERR(rootdir);
                goto err;
        }
 
@@ -450,7 +451,7 @@ int wl1271_debugfs_init(struct wl1271 *wl)
 
        wl->stats.fw_stats_update = jiffies;
 
-       ret = wl1271_debugfs_add_files(wl);
+       ret = wl1271_debugfs_add_files(wl, rootdir);
 
        if (ret < 0)
                goto err_file;
@@ -462,8 +463,7 @@ err_file:
        wl->stats.fw_stats = NULL;
 
 err_fw:
-       debugfs_remove_recursive(wl->rootdir);
-       wl->rootdir = NULL;
+       debugfs_remove_recursive(rootdir);
 
 err:
        return ret;
@@ -473,8 +473,4 @@ void wl1271_debugfs_exit(struct wl1271 *wl)
 {
        kfree(wl->stats.fw_stats);
        wl->stats.fw_stats = NULL;
-
-       debugfs_remove_recursive(wl->rootdir);
-       wl->rootdir = NULL;
-
 }
index 9050dd9b62d2e9ec46d3860a54b7f6781249e78e..c3c30b3abc15f63a3cd274cfd5ab355085a391d3 100644 (file)
@@ -378,7 +378,6 @@ struct wl1271 {
        int last_rssi_event;
 
        struct wl1271_stats stats;
-       struct dentry *rootdir;
 
        __le32 buffer_32;
        u32 buffer_cmd;