This patch adds checking of driver registration status
and if it fails release allocated resources.

Signed-off-by: Cyrill Gorcunov <[EMAIL PROTECTED]>

---

Pete, please review the patch and Ack it then.

 drivers/usb/misc/ftdi-elan.c |   37 +++++++++++++++++++++++--------------
 1 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index bc3327e..3cd9ae3 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -2909,27 +2909,36 @@ static int __init ftdi_elan_init(void)
         init_MUTEX(&ftdi_module_lock);
         INIT_LIST_HEAD(&ftdi_static_list);
         status_queue = create_singlethread_workqueue("ftdi-status-control");
-       if (!status_queue)
-               goto err1;
         command_queue = create_singlethread_workqueue("ftdi-command-engine");
-       if (!command_queue)
-               goto err2;
         respond_queue = create_singlethread_workqueue("ftdi-respond-engine");
-       if (!respond_queue)
-               goto err3;
+       if (!status_queue || !command_queue || !respond_queue) {
+               printk(KERN_ERR "%s couldn't create workqueue\n",
+                      ftdi_elan_driver.name);
+               result = -ENOMEM;
+               goto err;
+       }
         result = usb_register(&ftdi_elan_driver);
-        if (result)
+        if (result) {
                 printk(KERN_ERR "usb_register failed. Error number %d\n",
                       result);
+               goto err;
+       }
         return result;
 
- err3:
-       destroy_workqueue(command_queue);
- err2:
-       destroy_workqueue(status_queue);
- err1:
-       printk(KERN_ERR "%s couldn't create workqueue\n", 
ftdi_elan_driver.name);
-       return -ENOMEM;
+ err:
+       if (status_queue) {
+               destroy_workqueue(status_queue);
+               status_queue = NULL;
+       }
+       if (command_queue) {
+               destroy_workqueue(command_queue);
+               command_queue = NULL;
+       }
+       if (respond_queue) {
+               destroy_workqueue(respond_queue);
+               respond_queue = NULL;
+       }
+       return result;
 }
 
 static void __exit ftdi_elan_exit(void)
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to