LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] USB Elan FTDI: check for driver registration status
@ 2007-03-25  7:27 Cyrill Gorcunov
  2007-03-26 18:43 ` Luiz Fernando N. Capitulino
  2007-03-26 22:17 ` Pete Zaitcev
  0 siblings, 2 replies; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-25  7:27 UTC (permalink / raw)
  To: Pete Zaitcev; +Cc: Andrew Morton, linux-kernel-list

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

Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>

---

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)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-25  7:27 [PATCH] USB Elan FTDI: check for driver registration status Cyrill Gorcunov
@ 2007-03-26 18:43 ` Luiz Fernando N. Capitulino
  2007-03-26 19:33   ` Cyrill Gorcunov
  2007-03-28 16:00   ` Cyrill Gorcunov
  2007-03-26 22:17 ` Pete Zaitcev
  1 sibling, 2 replies; 14+ messages in thread
From: Luiz Fernando N. Capitulino @ 2007-03-26 18:43 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: Pete Zaitcev, Andrew Morton, linux-kernel-list


 Hi Cyrill,

Em Sun, 25 Mar 2007 11:27:33 +0400
Cyrill Gorcunov <gorcunov@gmail.com> escreveu:

| This patch adds checking of driver registration status
| and if it fails release allocated resources.
| 
| Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
| 
| ---
| 
| 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;
| +	}

 The current version looks ok to me, why are you changing it?

 It's also smater, ie, if the first workqueue creation fails, it
won't try to create the others.

|          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;

 This could be:

"""
if (result) {
	printk(KERN_ERR "usb_register failed. Error number %d\n",
	    result);
	destroy_workqueue(respond_queue);
	goto err3;
}
"""

 And you can change 'err1' to return 'result'.

-- 
Luiz Fernando N. Capitulino

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-26 18:43 ` Luiz Fernando N. Capitulino
@ 2007-03-26 19:33   ` Cyrill Gorcunov
  2007-03-26 19:56     ` Luiz Fernando N. Capitulino
  2007-03-28 16:00   ` Cyrill Gorcunov
  1 sibling, 1 reply; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-26 19:33 UTC (permalink / raw)
  To: Luiz Fernando N. Capitulino; +Cc: linux-kernel-list

[Luiz Fernando N. Capitulino - Mon, Mar 26, 2007 at 03:43:57PM -0300]
| 
|  Hi Cyrill,
| 
| Em Sun, 25 Mar 2007 11:27:33 +0400
| Cyrill Gorcunov <gorcunov@gmail.com> escreveu:
| 
| | This patch adds checking of driver registration status
| | and if it fails release allocated resources.
| | 
| | Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
| | 
| | ---
| | 
| | 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;
| | +	}
| 
|  The current version looks ok to me, why are you changing it?
| 
|  It's also smater, ie, if the first workqueue creation fails, it
| won't try to create the others.
| 
| |          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;
| 
|  This could be:
| 
| """
| if (result) {
| 	printk(KERN_ERR "usb_register failed. Error number %d\n",
| 	    result);
| 	destroy_workqueue(respond_queue);
| 	goto err3;
| }
| """
| 
|  And you can change 'err1' to return 'result'.
| 
| -- 
| Luiz Fernando N. Capitulino
| 

Hi Luiz,

if usb registration failed we should release all worqueues we've
created and that is the reason why I've changed the code...

but anyway I have to find more elegant solution I think :)

		Cyrill


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-26 19:33   ` Cyrill Gorcunov
@ 2007-03-26 19:56     ` Luiz Fernando N. Capitulino
  0 siblings, 0 replies; 14+ messages in thread
From: Luiz Fernando N. Capitulino @ 2007-03-26 19:56 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: linux-kernel-list

Em Mon, 26 Mar 2007 23:33:12 +0400
Cyrill Gorcunov <gorcunov@gmail.com> escreveu:

| if usb registration failed we should release all worqueues we've
| created and that is the reason why I've changed the code...

 I see, maybe something like the following (not tested):

diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index bc3327e..cf95ae8 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -2903,7 +2903,8 @@ static struct usb_driver ftdi_elan_drive
 };
 static int __init ftdi_elan_init(void)
 {
-        int result;
+        int result = -ENOMEM;
+
         printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
 	       __TIME__, __DATE__);
         init_MUTEX(&ftdi_module_lock);
@@ -2918,9 +2919,13 @@ static int __init ftdi_elan_init(void)
 	if (!respond_queue)
 		goto err3;
         result = usb_register(&ftdi_elan_driver);
-        if (result)
+        if (result) {
                 printk(KERN_ERR "usb_register failed. Error number %d\n",
 		       result);
+		destroy_workqueue(respond_queue);
+		goto err3;
+	}
+
         return result;
 
  err3:
@@ -2929,7 +2934,7 @@ static int __init ftdi_elan_init(void)
 	destroy_workqueue(status_queue);
  err1:
 	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
-	return -ENOMEM;
+	return result;
 }
 
 static void __exit ftdi_elan_exit(void)

PS: Please, don't remove people from the CC list (wait for them
to ask for that).

-- 
Luiz Fernando N. Capitulino

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-25  7:27 [PATCH] USB Elan FTDI: check for driver registration status Cyrill Gorcunov
  2007-03-26 18:43 ` Luiz Fernando N. Capitulino
@ 2007-03-26 22:17 ` Pete Zaitcev
  2007-03-27 15:14   ` Cyrill Gorcunov
  1 sibling, 1 reply; 14+ messages in thread
From: Pete Zaitcev @ 2007-03-26 22:17 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: Andrew Morton, linux-kernel-list

On Sun, 25 Mar 2007 11:27:33 +0400, Cyrill Gorcunov <gorcunov@gmail.com> wrote:

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

> +	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;

I hate this style with passion, but I don't have cycles to argue.
So, whatever works for you and Greg is fine with me.

-- Pete

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-26 22:17 ` Pete Zaitcev
@ 2007-03-27 15:14   ` Cyrill Gorcunov
  2007-03-27 16:28     ` Luiz Fernando N. Capitulino
  2007-03-27 17:51     ` Pete Zaitcev
  0 siblings, 2 replies; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-27 15:14 UTC (permalink / raw)
  To: Pete Zaitcev
  Cc: Andrew Morton, linux-kernel-list, Luiz Fernando N. Capitulino

Pete, Luiz

what about this one?

Actually there is just a check for where is error coming from.
Maybe that is not the best solution but it allows us to reduce
the calls to 'printk' :)

P.S. Pete your patch is good but the message about
worqueue creation fail was to print even if we've
been faltered on the usb_register procedure.

---

 drivers/usb/misc/ftdi-elan.c |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index bc3327e..3cd54af 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
 };
 static int __init ftdi_elan_init(void)
 {
-        int result;
+        int result = 0;
         printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
 	       __TIME__, __DATE__);
         init_MUTEX(&ftdi_module_lock);
@@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
 	if (!respond_queue)
 		goto err3;
         result = usb_register(&ftdi_elan_driver);
-        if (result)
+        if (result) {
                 printk(KERN_ERR "usb_register failed. Error number %d\n",
 		       result);
+		goto err4;
+	}
         return result;
 
+ err4:
+	destroy_workqueue(respond_queue);
  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;
+	if (result == 0) {
+		result = -ENOMEM;
+		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
+	}
+	return result;
 }
 
 static void __exit ftdi_elan_exit(void)


		Cyrill


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 15:14   ` Cyrill Gorcunov
@ 2007-03-27 16:28     ` Luiz Fernando N. Capitulino
  2007-03-27 17:01       ` Cyrill Gorcunov
  2007-03-27 17:51     ` Pete Zaitcev
  1 sibling, 1 reply; 14+ messages in thread
From: Luiz Fernando N. Capitulino @ 2007-03-27 16:28 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: Pete Zaitcev, Andrew Morton, linux-kernel-list

Em Tue, 27 Mar 2007 19:14:05 +0400
Cyrill Gorcunov <gorcunov@gmail.com> escreveu:

| Pete, Luiz
| 
| what about this one?
| 
| Actually there is just a check for where is error coming from.
| Maybe that is not the best solution but it allows us to reduce
| the calls to 'printk' :)
| 
| P.S. Pete your patch is good but the message about
| worqueue creation fail was to print even if we've
| been faltered on the usb_register procedure.
| 
| ---
| 
|  drivers/usb/misc/ftdi-elan.c |   15 +++++++++++----
|  1 files changed, 11 insertions(+), 4 deletions(-)
| 
| diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
| index bc3327e..3cd54af 100644
| --- a/drivers/usb/misc/ftdi-elan.c
| +++ b/drivers/usb/misc/ftdi-elan.c
| @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
|  };
|  static int __init ftdi_elan_init(void)
|  {
| -        int result;
| +        int result = 0;
|          printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
|  	       __TIME__, __DATE__);
|          init_MUTEX(&ftdi_module_lock);
| @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
|  	if (!respond_queue)
|  		goto err3;
|          result = usb_register(&ftdi_elan_driver);
| -        if (result)
| +        if (result) {
|                  printk(KERN_ERR "usb_register failed. Error number %d\n",
|  		       result);
| +		goto err4;
| +	}
|          return result;
|  
| + err4:
| +	destroy_workqueue(respond_queue);
|   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;
| +	if (result == 0) {
| +		result = -ENOMEM;
| +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| +	}
| +	return result;
|  }

 I still the prefer the version I sent you yesterday. :) It
changes the minimal amount of code.

-- 
Luiz Fernando N. Capitulino

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 16:28     ` Luiz Fernando N. Capitulino
@ 2007-03-27 17:01       ` Cyrill Gorcunov
  2007-03-27 17:29         ` Luiz Fernando N. Capitulino
  0 siblings, 1 reply; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-27 17:01 UTC (permalink / raw)
  To: Luiz Fernando N. Capitulino
  Cc: Pete Zaitcev, linux-kernel-list, Andrew Morton

[Luiz Fernando N. Capitulino - Tue, Mar 27, 2007 at 01:28:39PM -0300]
| Em Tue, 27 Mar 2007 19:14:05 +0400
| Cyrill Gorcunov <gorcunov@gmail.com> escreveu:
| 
| | Pete, Luiz
| | 
| | what about this one?
| | 
| | Actually there is just a check for where is error coming from.
| | Maybe that is not the best solution but it allows us to reduce
| | the calls to 'printk' :)
| | 
| | P.S. Pete your patch is good but the message about
| | worqueue creation fail was to print even if we've
| | been faltered on the usb_register procedure.
| | 
| | ---
| | 
| |  drivers/usb/misc/ftdi-elan.c |   15 +++++++++++----
| |  1 files changed, 11 insertions(+), 4 deletions(-)
| | 
| | diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
| | index bc3327e..3cd54af 100644
| | --- a/drivers/usb/misc/ftdi-elan.c
| | +++ b/drivers/usb/misc/ftdi-elan.c
| | @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
| |  };
| |  static int __init ftdi_elan_init(void)
| |  {
| | -        int result;
| | +        int result = 0;
| |          printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
| |  	       __TIME__, __DATE__);
| |          init_MUTEX(&ftdi_module_lock);
| | @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
| |  	if (!respond_queue)
| |  		goto err3;
| |          result = usb_register(&ftdi_elan_driver);
| | -        if (result)
| | +        if (result) {
| |                  printk(KERN_ERR "usb_register failed. Error number %d\n",
| |  		       result);
| | +		goto err4;
| | +	}
| |          return result;
| |  
| | + err4:
| | +	destroy_workqueue(respond_queue);
| |   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;
| | +	if (result == 0) {
| | +		result = -ENOMEM;
| | +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| | +	}
| | +	return result;
| |  }
| 
|  I still the prefer the version I sent you yesterday. :) It
| changes the minimal amount of code.
| 
| -- 
| Luiz Fernando N. Capitulino
| 

Liuz,

but the patch you sent me does call

	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);

even if error occured in usb_register and that is not good I think.
Fix me if I'm wrong.

		Cyrill


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 17:01       ` Cyrill Gorcunov
@ 2007-03-27 17:29         ` Luiz Fernando N. Capitulino
  2007-03-27 17:37           ` Cyrill Gorcunov
  0 siblings, 1 reply; 14+ messages in thread
From: Luiz Fernando N. Capitulino @ 2007-03-27 17:29 UTC (permalink / raw)
  To: Cyrill Gorcunov; +Cc: Pete Zaitcev, linux-kernel-list, Andrew Morton

Em Tue, 27 Mar 2007 21:01:25 +0400
Cyrill Gorcunov <gorcunov@gmail.com> escreveu:

| [Luiz Fernando N. Capitulino - Tue, Mar 27, 2007 at 01:28:39PM -0300]
| | Em Tue, 27 Mar 2007 19:14:05 +0400
| | Cyrill Gorcunov <gorcunov@gmail.com> escreveu:
| | 
| | | Pete, Luiz
| | | 
| | | what about this one?
| | | 
| | | Actually there is just a check for where is error coming from.
| | | Maybe that is not the best solution but it allows us to reduce
| | | the calls to 'printk' :)
| | | 
| | | P.S. Pete your patch is good but the message about
| | | worqueue creation fail was to print even if we've
| | | been faltered on the usb_register procedure.
| | | 
| | | ---
| | | 
| | |  drivers/usb/misc/ftdi-elan.c |   15 +++++++++++----
| | |  1 files changed, 11 insertions(+), 4 deletions(-)
| | | 
| | | diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
| | | index bc3327e..3cd54af 100644
| | | --- a/drivers/usb/misc/ftdi-elan.c
| | | +++ b/drivers/usb/misc/ftdi-elan.c
| | | @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
| | |  };
| | |  static int __init ftdi_elan_init(void)
| | |  {
| | | -        int result;
| | | +        int result = 0;
| | |          printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
| | |  	       __TIME__, __DATE__);
| | |          init_MUTEX(&ftdi_module_lock);
| | | @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
| | |  	if (!respond_queue)
| | |  		goto err3;
| | |          result = usb_register(&ftdi_elan_driver);
| | | -        if (result)
| | | +        if (result) {
| | |                  printk(KERN_ERR "usb_register failed. Error number %d\n",
| | |  		       result);
| | | +		goto err4;
| | | +	}
| | |          return result;
| | |  
| | | + err4:
| | | +	destroy_workqueue(respond_queue);
| | |   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;
| | | +	if (result == 0) {
| | | +		result = -ENOMEM;
| | | +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| | | +	}
| | | +	return result;
| | |  }
| | 
| |  I still the prefer the version I sent you yesterday. :) It
| | changes the minimal amount of code.
| | 
| | -- 
| | Luiz Fernando N. Capitulino
| | 
| 
| Liuz,
| 
| but the patch you sent me does call
| 
| 	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| 
| even if error occured in usb_register and that is not good I think.
| Fix me if I'm wrong.

 No, you're right. I missed it.

 Signed-off-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>

 But Greg is the right person to submit this.

-- 
Luiz Fernando N. Capitulino

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 17:29         ` Luiz Fernando N. Capitulino
@ 2007-03-27 17:37           ` Cyrill Gorcunov
  0 siblings, 0 replies; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-27 17:37 UTC (permalink / raw)
  To: Luiz Fernando N. Capitulino
  Cc: Pete Zaitcev, linux-kernel-list, Andrew Morton

[Luiz Fernando N. Capitulino - Tue, Mar 27, 2007 at 02:29:04PM -0300]
| Em Tue, 27 Mar 2007 21:01:25 +0400
| Cyrill Gorcunov <gorcunov@gmail.com> escreveu:
| 
| | [Luiz Fernando N. Capitulino - Tue, Mar 27, 2007 at 01:28:39PM -0300]
| | | Em Tue, 27 Mar 2007 19:14:05 +0400
| | | Cyrill Gorcunov <gorcunov@gmail.com> escreveu:
| | | 
| | | | Pete, Luiz
| | | | 
| | | | what about this one?
| | | | 
| | | | Actually there is just a check for where is error coming from.
| | | | Maybe that is not the best solution but it allows us to reduce
| | | | the calls to 'printk' :)
| | | | 
| | | | P.S. Pete your patch is good but the message about
| | | | worqueue creation fail was to print even if we've
| | | | been faltered on the usb_register procedure.
| | | | 
| | | | ---
| | | | 
| | | |  drivers/usb/misc/ftdi-elan.c |   15 +++++++++++----
| | | |  1 files changed, 11 insertions(+), 4 deletions(-)
| | | | 
| | | | diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
| | | | index bc3327e..3cd54af 100644
| | | | --- a/drivers/usb/misc/ftdi-elan.c
| | | | +++ b/drivers/usb/misc/ftdi-elan.c
| | | | @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
| | | |  };
| | | |  static int __init ftdi_elan_init(void)
| | | |  {
| | | | -        int result;
| | | | +        int result = 0;
| | | |          printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
| | | |  	       __TIME__, __DATE__);
| | | |          init_MUTEX(&ftdi_module_lock);
| | | | @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
| | | |  	if (!respond_queue)
| | | |  		goto err3;
| | | |          result = usb_register(&ftdi_elan_driver);
| | | | -        if (result)
| | | | +        if (result) {
| | | |                  printk(KERN_ERR "usb_register failed. Error number %d\n",
| | | |  		       result);
| | | | +		goto err4;
| | | | +	}
| | | |          return result;
| | | |  
| | | | + err4:
| | | | +	destroy_workqueue(respond_queue);
| | | |   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;
| | | | +	if (result == 0) {
| | | | +		result = -ENOMEM;
| | | | +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| | | | +	}
| | | | +	return result;
| | | |  }
| | | 
| | |  I still the prefer the version I sent you yesterday. :) It
| | | changes the minimal amount of code.
| | | 
| | | -- 
| | | Luiz Fernando N. Capitulino
| | | 
| | 
| | Liuz,
| | 
| | but the patch you sent me does call
| | 
| | 	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| | 
| | even if error occured in usb_register and that is not good I think.
| | Fix me if I'm wrong.
| 
|  No, you're right. I missed it.
| 
|  Signed-off-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
| 
|  But Greg is the right person to submit this.
| 
| -- 
| Luiz Fernando N. Capitulino
| 

You mean Greg KH?

		Cyrill


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 15:14   ` Cyrill Gorcunov
  2007-03-27 16:28     ` Luiz Fernando N. Capitulino
@ 2007-03-27 17:51     ` Pete Zaitcev
  2007-03-27 18:16       ` Cyrill Gorcunov
  1 sibling, 1 reply; 14+ messages in thread
From: Pete Zaitcev @ 2007-03-27 17:51 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Andrew Morton, linux-kernel-list, Luiz Fernando N. Capitulino, zaitcev

On Tue, 27 Mar 2007 19:14:05 +0400, Cyrill Gorcunov <gorcunov@gmail.com> wrote:

> --- a/drivers/usb/misc/ftdi-elan.c
> @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
>  };
>  static int __init ftdi_elan_init(void)
>  {
> -        int result;
> +        int result = 0;

Why do you need this?

> @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
>  	if (!respond_queue)
>  		goto err3;
>          result = usb_register(&ftdi_elan_driver);
> -        if (result)
> +        if (result) {
>                  printk(KERN_ERR "usb_register failed. Error number %d\n",
>  		       result);
> +		goto err4;
> +	}
>          return result;
>  
> + err4:
> +	destroy_workqueue(respond_queue);
>   err3:

This is fine, although I do wish you wouldn't number the exception labels.
If anything is changed, someone might try to rearrange and renumber them
and that leads to bugs.

>   err1:
> -	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
> -	return -ENOMEM;
> +	if (result == 0) {
> +		result = -ENOMEM;
> +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
> +	}
> +	return result;

What in the world is this supposed to do? Under what conditions can
result be zero here?

Personally, I would get rid of the printk. If your modprobe fails,
it's a good enough indication. Or at least, change the text to
something more neutral, like "unable to initialize (%d)" and print
the error code. It's not just about workqueues now.

-- Pete

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-27 17:51     ` Pete Zaitcev
@ 2007-03-27 18:16       ` Cyrill Gorcunov
  0 siblings, 0 replies; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-27 18:16 UTC (permalink / raw)
  To: Pete Zaitcev
  Cc: Andrew Morton, linux-kernel-list, Luiz Fernando N. Capitulino

[Pete Zaitcev - Tue, Mar 27, 2007 at 10:51:16AM -0700]
| On Tue, 27 Mar 2007 19:14:05 +0400, Cyrill Gorcunov <gorcunov@gmail.com> wrote:
| 
| > --- a/drivers/usb/misc/ftdi-elan.c
| > @@ -2903,7 +2903,7 @@ static struct usb_driver ftdi_elan_driver = {
| >  };
| >  static int __init ftdi_elan_init(void)
| >  {
| > -        int result;
| > +        int result = 0;
| 
| Why do you need this?

Setting result to 0 indicate that there is no errors. Pete, look
this init code does the following - 

	1) creates 3 workqueues
	2) register usb driver

So we have:
	- at each step of creating worqueue we have to check if it was
	  succsessfull
	- if all workqeues were successfully created we need to check if
	  usb registration failed

So we can get error on any step and there is a question how to properly
and eleganly handle them... the solution I proposed maybe is not ideal
but you may help me supposing your own patch :)

And as result I set 'results=0' to prevent from printing message about
worqueue fails if the error _really_ occured in usb_register. Just
review the function at whole and you will find the reason.

| > @@ -2918,18 +2918,25 @@ static int __init ftdi_elan_init(void)
| >  	if (!respond_queue)
| >  		goto err3;
| >          result = usb_register(&ftdi_elan_driver);
| > -        if (result)
| > +        if (result) {
| >                  printk(KERN_ERR "usb_register failed. Error number %d\n",
| >  		       result);
| > +		goto err4;
| > +	}
| >          return result;
| >  
| > + err4:
| > +	destroy_workqueue(respond_queue);
| >   err3:
| 
| This is fine, although I do wish you wouldn't number the exception labels.
| If anything is changed, someone might try to rearrange and renumber them
| and that leads to bugs.

Agree, may be the labels could be like:

	err_respond_queue:

and so on?

| 
| >   err1:
| > -	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| > -	return -ENOMEM;
| > +	if (result == 0) {
| > +		result = -ENOMEM;
| > +		printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
| > +	}
| > +	return result;
| 
| What in the world is this supposed to do? Under what conditions can
| result be zero here?

If error was in worqueue creation then there will be 0.

| 
| Personally, I would get rid of the printk. If your modprobe fails,
| it's a good enough indication. Or at least, change the text to
| something more neutral, like "unable to initialize (%d)" and print
| the error code. It's not just about workqueues now.
| 
| -- Pete
| 

Can't agree... if modprobe failed I wonna know _where_ it happens and
why :) Or maybe I misunderstood you...

		Cyrill


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-26 18:43 ` Luiz Fernando N. Capitulino
  2007-03-26 19:33   ` Cyrill Gorcunov
@ 2007-03-28 16:00   ` Cyrill Gorcunov
  2007-03-28 18:41     ` Pete Zaitcev
  1 sibling, 1 reply; 14+ messages in thread
From: Cyrill Gorcunov @ 2007-03-28 16:00 UTC (permalink / raw)
  To: Luiz Fernando N. Capitulino
  Cc: Pete Zaitcev, Andrew Morton, linux-kernel-list

Pete, Luiz

check this one please.

I've inspected ftdi-elan.c for style and as result
the solution I propose is just to add explicit
destroying of worqueues if usb_register failed.

And Pete, take a look - whoa! - I've renamed error labels :)


		Cyrill

---

 drivers/usb/misc/ftdi-elan.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c
index bc3327e..d9cbdb8 100644
--- a/drivers/usb/misc/ftdi-elan.c
+++ b/drivers/usb/misc/ftdi-elan.c
@@ -2910,24 +2910,28 @@ static int __init ftdi_elan_init(void)
         INIT_LIST_HEAD(&ftdi_static_list);
         status_queue = create_singlethread_workqueue("ftdi-status-control");
 	if (!status_queue)
-		goto err1;
+		goto err_status_queue;
         command_queue = create_singlethread_workqueue("ftdi-command-engine");
 	if (!command_queue)
-		goto err2;
+		goto err_command_queue;
         respond_queue = create_singlethread_workqueue("ftdi-respond-engine");
 	if (!respond_queue)
-		goto err3;
+		goto err_respond_queue;
         result = usb_register(&ftdi_elan_driver);
-        if (result)
+        if (result) {
+		destroy_workqueue(status_queue);
+		destroy_workqueue(command_queue);
+		destroy_workqueue(respond_queue);
                 printk(KERN_ERR "usb_register failed. Error number %d\n",
 		       result);
+	}
         return result;
 
- err3:
+ err_respond_queue:
 	destroy_workqueue(command_queue);
- err2:
+ err_command_queue:
 	destroy_workqueue(status_queue);
- err1:
+ err_status_queue:
 	printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
 	return -ENOMEM;
 }

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH] USB Elan FTDI: check for driver registration status
  2007-03-28 16:00   ` Cyrill Gorcunov
@ 2007-03-28 18:41     ` Pete Zaitcev
  0 siblings, 0 replies; 14+ messages in thread
From: Pete Zaitcev @ 2007-03-28 18:41 UTC (permalink / raw)
  To: Cyrill Gorcunov
  Cc: Luiz Fernando N. Capitulino, Andrew Morton, linux-kernel-list

On Wed, 28 Mar 2007 20:00:32 +0400, Cyrill Gorcunov <gorcunov@gmail.com> wrote:

>          result = usb_register(&ftdi_elan_driver);
> -        if (result)
> +        if (result) {
> +		destroy_workqueue(status_queue);
> +		destroy_workqueue(command_queue);
> +		destroy_workqueue(respond_queue);
>                  printk(KERN_ERR "usb_register failed. Error number %d\n",
>  		       result);

I would just change the printk from "couldn't create workqueue"
to something more neutral, but this is ok too. Let's just declare
it fixed and move on.

-- Pete

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2007-03-28 18:44 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-03-25  7:27 [PATCH] USB Elan FTDI: check for driver registration status Cyrill Gorcunov
2007-03-26 18:43 ` Luiz Fernando N. Capitulino
2007-03-26 19:33   ` Cyrill Gorcunov
2007-03-26 19:56     ` Luiz Fernando N. Capitulino
2007-03-28 16:00   ` Cyrill Gorcunov
2007-03-28 18:41     ` Pete Zaitcev
2007-03-26 22:17 ` Pete Zaitcev
2007-03-27 15:14   ` Cyrill Gorcunov
2007-03-27 16:28     ` Luiz Fernando N. Capitulino
2007-03-27 17:01       ` Cyrill Gorcunov
2007-03-27 17:29         ` Luiz Fernando N. Capitulino
2007-03-27 17:37           ` Cyrill Gorcunov
2007-03-27 17:51     ` Pete Zaitcev
2007-03-27 18:16       ` Cyrill Gorcunov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).