ChangeSet 1.924.3.1, 2002/11/30 00:01:04-08:00, oliver@oenone.homelinux.org

[PATCH] module unload race with usb serial drivers

the serial subdrivers may be unloading while we open.
This patch against 2.5 guards against that.


diff -Nru a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
--- a/drivers/usb/serial/usb-serial.c	Sun Dec  1 23:06:33 2002
+++ b/drivers/usb/serial/usb-serial.c	Sun Dec  1 23:06:33 2002
@@ -467,9 +467,13 @@
 	down (&port->sem);
 	port->tty = tty;
 	 
-	/* lock this module before we call it */
+	/* lock this module before we call it,
+	   this may, which means we must bail out, safe because we are called with BKL held */
 	if (serial->type->owner)
-		__MOD_INC_USE_COUNT(serial->type->owner);
+		if (!try_module_get(serial->type->owner)) {
+			retval = -ENODEV;
+			goto bailout;
+		}
 
 	++port->open_count;
 	if (port->open_count == 1) {
@@ -485,6 +489,7 @@
 				__MOD_DEC_USE_COUNT(serial->type->owner);
 		}
 	}
+bailout:
 
 	up (&port->sem);
 	return retval;
