On Thu, 22 Nov 2001, Oliver Neukum wrote:
> > - fixes a problem with MOD_INC_USE_COUNT / MOD_DEC_USE_COUNT in
> > open_scanner()
>
> How ? Also you remove scn->mutex from open(). You must not do so as you race
> with disconnect()
You're right. New patch attached.
Frank.
--- scanner.c.org Wed Nov 21 22:49:47 2001
+++ scanner.c Thu Nov 22 13:21:39 2001
@@ -324,17 +324,16 @@
struct scn_usb_data *scn;
unsigned char *data;
scn = urb->context;
- down(&(scn->sem));
+
data = &scn->button;
data += 0; /* Keep gcc from complaining about unused var */
if (urb->status) {
- up(&(scn->sem));
return;
}
dbg("irq_scanner(%d): data:%x", scn->scn_minor, *data);
- up(&(scn->sem));
+
return;
}
@@ -358,6 +357,7 @@
if (!p_scn_table[scn_minor]) {
up(&scn_mutex);
+ MOD_DEC_USE_COUNT;
err("open_scanner(%d): Unable to access minor data", scn_minor);
return -ENODEV;
}
@@ -939,6 +939,7 @@
/* Check to make sure that the last slot isn't already taken */
if (p_scn_table[scn_minor]) {
err("probe_scanner: No more minor devices remaining.");
+ up(&scn_mutex);
return NULL;
}
@@ -946,6 +947,7 @@
if (!(scn = kmalloc (sizeof (struct scn_usb_data), GFP_KERNEL))) {
err("probe_scanner: Out of memory.");
+ up(&scn_mutex);
return NULL;
}
memset (scn, 0, sizeof(struct scn_usb_data));
@@ -1028,9 +1030,11 @@
if (scn->devfs == NULL)
dbg("scanner%d: device node registration failed", scn_minor);
+ p_scn_table[scn_minor] = scn;
+
up(&scn_mutex);
- return p_scn_table[scn_minor] = scn;
+ return scn;
}
static void