USB: ehci: fix remove of ehci debugfs dir
authorMing Lei <tom.leiming@gmail.com>
Wed, 28 Jul 2010 14:33:28 +0000 (22:33 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Aug 2010 21:35:44 +0000 (14:35 -0700)
The patch below on gregkh tree only creates 'lpm' file under
ehci->debug_dir, but not removes it when unloading module,

 USB: EHCI: EHCI 1.1 addendum: preparation

which can make loading of ehci-hcd module failed after unloading it.

This patch replaces debugfs_remove with debugfs_remove_recursive
to remove ehci debugfs dir and files. It does fix the bug above,
and may simplify the removing procedure.

Also, remove the debug_registers, debug_async and debug_periodic
field from ehci_hcd struct since they are useless now.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/host/ehci-dbg.c
drivers/usb/host/ehci.h

index 4498efb49b95a66cc9cc9e5b08716df860892d02..76b7fd2d838a32a9abdaae48d8c862090b3a0ed9 100644 (file)
@@ -1049,49 +1049,33 @@ static inline void create_debug_files (struct ehci_hcd *ehci)
 
        ehci->debug_dir = debugfs_create_dir(bus->bus_name, ehci_debug_root);
        if (!ehci->debug_dir)
-               goto dir_error;
-
-       ehci->debug_async = debugfs_create_file("async", S_IRUGO,
-                                               ehci->debug_dir, bus,
-                                               &debug_async_fops);
-       if (!ehci->debug_async)
-               goto async_error;
-
-       ehci->debug_periodic = debugfs_create_file("periodic", S_IRUGO,
-                                                  ehci->debug_dir, bus,
-                                                  &debug_periodic_fops);
-       if (!ehci->debug_periodic)
-               goto periodic_error;
-
-       ehci->debug_registers = debugfs_create_file("registers", S_IRUGO,
-                                                   ehci->debug_dir, bus,
-                                                   &debug_registers_fops);
-
-       ehci->debug_registers = debugfs_create_file("lpm", S_IRUGO|S_IWUGO,
-                                                   ehci->debug_dir, bus,
-                                                   &debug_lpm_fops);
-       if (!ehci->debug_registers)
-               goto registers_error;
+               return;
+
+       if (!debugfs_create_file("async", S_IRUGO, ehci->debug_dir, bus,
+                                               &debug_async_fops))
+               goto file_error;
+
+       if (!debugfs_create_file("periodic", S_IRUGO, ehci->debug_dir, bus,
+                                               &debug_periodic_fops))
+               goto file_error;
+
+       if (!debugfs_create_file("registers", S_IRUGO, ehci->debug_dir, bus,
+                                                   &debug_registers_fops))
+               goto file_error;
+
+       if (!debugfs_create_file("lpm", S_IRUGO|S_IWUGO, ehci->debug_dir, bus,
+                                                   &debug_lpm_fops))
+               goto file_error;
+
        return;
 
-registers_error:
-       debugfs_remove(ehci->debug_periodic);
-periodic_error:
-       debugfs_remove(ehci->debug_async);
-async_error:
-       debugfs_remove(ehci->debug_dir);
-dir_error:
-       ehci->debug_periodic = NULL;
-       ehci->debug_async = NULL;
-       ehci->debug_dir = NULL;
+file_error:
+       debugfs_remove_recursive(ehci->debug_dir);
 }
 
 static inline void remove_debug_files (struct ehci_hcd *ehci)
 {
-       debugfs_remove(ehci->debug_registers);
-       debugfs_remove(ehci->debug_periodic);
-       debugfs_remove(ehci->debug_async);
-       debugfs_remove(ehci->debug_dir);
+       debugfs_remove_recursive(ehci->debug_dir);
 }
 
 #endif /* STUB_DEBUG_FILES */
index e5b9ece8a077e5664497159717f3c5fad2c83fdc..bde823f704e9a6d496cf735f08658fa7f2f6397b 100644 (file)
@@ -156,10 +156,6 @@ struct ehci_hcd {                  /* one per controller */
        /* debug files */
 #ifdef DEBUG
        struct dentry           *debug_dir;
-       struct dentry           *debug_async;
-       struct dentry           *debug_periodic;
-       struct dentry           *debug_registers;
-       struct dentry           *debug_lpm;
 #endif
 };