Re: [linux-usb-devel] [PATCH] USB speedtouch: don't open a connection if no firmware

From: Duncan Sands (baldrick@wanadoo.fr)
Date: Wed Apr 09 2003 - 03:28:25 EST


> > Hi Greg, I'm waiting on the fixes to the ATM layer (coming soon to a
> > kernel near you).
>
> Ah, ok, that makes sense.
>
> > As for the position of MOD_INC_USE_COUNT, did you ever hear
> > of anyone getting bitten by a race like this? If it makes you feel
> > better, I will move it up, probably just before I take the semaphore
> > (since that is the first place we can sleep). I will do it tomorrow, OK?
>
> Yes, it needs to be before any function that can sleep. I'll hold off
> applying this patch then.

How about this one instead. MOD_INC_USE_COUNT is placed before I call
any functions that can sleep. Let's just hope that the call to me doesn't
come after some sleeping in the higher layers...

Duncan.

--- redux-2.5/drivers/usb/misc/speedtch.c 2003-04-08 08:49:33.000000000 +0200
+++ bollux-2.5/drivers/usb/misc/speedtch.c 2003-04-09 10:08:27.000000000 +0200
@@ -933,15 +933,24 @@
         if (vcc->qos.aal != ATM_AAL5)
                 return -EINVAL;
 
+ if (!instance->firmware_loaded) {
+ dbg ("firmware not loaded!");
+ return -EAGAIN;
+ }
+
+ MOD_INC_USE_COUNT;
+
         down (&instance->serialize); /* vs self, udsl_atm_close */
 
         if (udsl_find_vcc (instance, vpi, vci)) {
                 up (&instance->serialize);
+ MOD_DEC_USE_COUNT;
                 return -EADDRINUSE;
         }
 
         if (!(new = kmalloc (sizeof (struct udsl_vcc_data), GFP_KERNEL))) {
                 up (&instance->serialize);
+ MOD_DEC_USE_COUNT;
                 return -ENOMEM;
         }
 
@@ -967,10 +976,7 @@
 
         dbg ("Allocated new SARLib vcc 0x%p with vpi %d vci %d", new, vpi, vci);
 
- MOD_INC_USE_COUNT;
-
- if (instance->firmware_loaded)
- udsl_fire_receivers (instance);
+ udsl_fire_receivers (instance);
 
         dbg ("udsl_atm_open successful");
 
@@ -1041,6 +1047,7 @@
                 int ret;
 
                 if ((ret = usb_set_interface (instance->usb_dev, 1, 1)) < 0) {
+ dbg ("usb_set_interface returned %d!", ret);
                         up (&instance->serialize);
                         return ret;
                 }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Apr 15 2003 - 22:00:17 EST