Hi!
This fixes the pointed out problems with MOD_INC_COUNT and MOD_DEC_COUNT
in my part of USB drivers. It also changes the xxx_table array size from
BITS_PER_LONG (32) to XXX_MINORS (32). It was a relict of the previous
design and was wrong, although harmless (I doubt BITS_PER_LONG is less
than 32 on any arch).
--
Vojtech Pavlik
SuSE Labs
diff -urN linux-2.3.99-pre3-old/drivers/usb/acm.c linux/drivers/usb/acm.c
--- linux-2.3.99-pre3-old/drivers/usb/acm.c Sat Apr 1 14:08:50 2000
+++ linux/drivers/usb/acm.c Sat Apr 1 23:05:21 2000
@@ -307,21 +307,19 @@
if (!acm || !acm->used) return;
- MOD_DEC_USE_COUNT;
-
- if (--acm->used) return;
-
- if (acm->dev) {
- acm_set_control(acm, acm->ctrlout = 0);
- usb_unlink_urb(&acm->ctrlurb);
- usb_unlink_urb(&acm->writeurb);
- usb_unlink_urb(&acm->readurb);
- return;
+ if (!--acm->used) {
+ if (acm->dev) {
+ acm_set_control(acm, acm->ctrlout = 0);
+ usb_unlink_urb(&acm->ctrlurb);
+ usb_unlink_urb(&acm->writeurb);
+ usb_unlink_urb(&acm->readurb);
+ } else {
+ tty_unregister_devfs(&acm_tty_driver, acm->minor);
+ acm_table[acm->minor] = NULL;
+ kfree(acm);
+ }
}
-
- tty_unregister_devfs(&acm_tty_driver, acm->minor);
- acm_table[acm->minor] = NULL;
- kfree(acm);
+ MOD_DEC_USE_COUNT;
}
static int acm_tty_write(struct tty_struct *tty, int from_user, const unsigned char
*buf, int count)
diff -urN linux-2.3.99-pre3-old/drivers/usb/evdev.c linux/drivers/usb/evdev.c
--- linux-2.3.99-pre3-old/drivers/usb/evdev.c Sat Apr 1 14:32:30 2000
+++ linux/drivers/usb/evdev.c Sat Apr 1 22:50:21 2000
@@ -56,7 +56,7 @@
struct evdev_list *next;
};
-static struct evdev *evdev_table[BITS_PER_LONG] = { NULL, /* ... */ };
+static struct evdev *evdev_table[EVDEV_MINORS] = { NULL, /* ... */ };
static void evdev_event(struct input_handle *handle, unsigned int type, unsigned int
code, int value)
{
@@ -119,9 +119,12 @@
if (i > EVDEV_MINORS || !evdev_table[i])
return -ENODEV;
- if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL)))
- return -ENOMEM;
+ MOD_INC_USE_COUNT;
+ if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL))) {
+ MOD_DEC_USE_COUNT;
+ return -ENOMEM;
+ }
memset(list, 0, sizeof(struct evdev_list));
list->evdev = evdev_table[i];
@@ -132,7 +135,6 @@
list->evdev->used++;
- MOD_INC_USE_COUNT;
return 0;
}
diff -urN linux-2.3.99-pre3-old/drivers/usb/joydev.c linux/drivers/usb/joydev.c
--- linux-2.3.99-pre3-old/drivers/usb/joydev.c Wed Mar 29 13:18:16 2000
+++ linux/drivers/usb/joydev.c Sat Apr 1 22:50:09 2000
@@ -78,7 +78,7 @@
struct joydev_list *next;
};
-static struct joydev *joydev_table[BITS_PER_LONG];
+static struct joydev *joydev_table[JOYDEV_MINORS];
MODULE_AUTHOR("Vojtech Pavlik <[EMAIL PROTECTED]>");
MODULE_SUPPORTED_DEVICE("input/js");
@@ -186,8 +186,12 @@
if (i > JOYDEV_MINORS || !joydev_table[i])
return -ENODEV;
- if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL)))
+ MOD_INC_USE_COUNT;
+
+ if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL))) {
+ MOD_DEC_USE_COUNT;
return -ENOMEM;
+ }
memset(list, 0, sizeof(struct joydev_list));
list->joydev = joydev_table[i];
@@ -198,7 +202,6 @@
list->joydev->used++;
- MOD_INC_USE_COUNT;
return 0;
}
diff -urN linux-2.3.99-pre3-old/drivers/usb/mousedev.c linux/drivers/usb/mousedev.c
--- linux-2.3.99-pre3-old/drivers/usb/mousedev.c Wed Mar 29 13:18:16 2000
+++ linux/drivers/usb/mousedev.c Sat Apr 1 22:50:16 2000
@@ -70,7 +70,7 @@
static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 };
static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
-static struct mousedev *mousedev_table[BITS_PER_LONG];
+static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned
int code, int value)
{
@@ -177,9 +177,12 @@
if (i > MOUSEDEV_MINORS || !mousedev_table[i])
return -ENODEV;
- if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL)))
- return -ENOMEM;
+ MOD_INC_USE_COUNT;
+ if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL))) {
+ MOD_DEC_USE_COUNT;
+ return -ENOMEM;
+ }
memset(list, 0, sizeof(struct mousedev_list));
list->mousedev = mousedev_table[i];
@@ -189,7 +192,6 @@
file->private_data = list;
- MOD_INC_USE_COUNT;
return 0;
}
@@ -360,19 +362,15 @@
printk(KERN_ERR "mousedev: no more free mousedev devices\n");
return -1;
}
-#else
- if (!mousedev_table[minor]) {
-#endif
- if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
- return -1;
- memset(mousedev, 0, sizeof(struct mousedev));
- init_waitqueue_head(&mousedev->wait);
-
- mousedev->devfs = input_register_minor("mouse%d", minor,
MOUSEDEV_MINOR_BASE);
+ if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
+ return -1;
+ memset(mousedev, 0, sizeof(struct mousedev));
+ init_waitqueue_head(&mousedev->wait);
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
- } else mousedev = mousedev_table[minor];
+ mousedev->devfs = input_register_minor("mouse%d", minor, MOUSEDEV_MINOR_BASE);
+#else
+ mousedev = mousedev_table[0];
#endif
if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) {
@@ -419,11 +417,24 @@
static int __init mousedev_init(void)
{
input_register_handler(&mousedev_handler);
+
+#ifdef CONFIG_INPUT_MOUSEDEV_MIX
+ if (!(mousedev_table[0] = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
+ return -1;
+ memset(mousedev_table[0], 0, sizeof(struct mousedev));
+ init_waitqueue_head(&mousedev_table[0]->wait);
+ mousedev_table[0]->devfs = input_register_minor("mouse%d", 0,
+MOUSEDEV_MINOR_BASE);
+ mousedev_table[0]->used = 1;
+#endif
return 0;
}
static void __exit mousedev_exit(void)
{
+#ifdef CONFIG_INPUT_MOUSEDEV_MIX
+ input_unregister_minor(mousedev_table[0]->devfs);
+ kfree(mousedev_table[0]);
+#endif
input_unregister_handler(&mousedev_handler);
}
diff -urN linux-2.3.99-pre3-old/drivers/usb/printer.c linux/drivers/usb/printer.c
--- linux-2.3.99-pre3-old/drivers/usb/printer.c Sat Mar 11 01:18:34 2000
+++ linux/drivers/usb/printer.c Sat Apr 1 22:51:48 2000
@@ -160,10 +160,13 @@
if (usblp->used)
return -EBUSY;
- if ((retval = usblp_check_status(usblp)))
+ MOD_INC_USE_COUNT;
+
+ if ((retval = usblp_check_status(usblp))) {
+ MOD_DEC_USE_COUNT;
return retval;
+ }
- MOD_INC_USE_COUNT;
usblp->used = 1;
file->private_data = usblp;
@@ -179,17 +182,18 @@
{
struct usblp *usblp = file->private_data;
- MOD_DEC_USE_COUNT;
usblp->used = 0;
if (usblp->dev) {
usb_unlink_urb(&usblp->readurb);
usb_unlink_urb(&usblp->writeurb);
+ MOD_DEC_USE_COUNT;
return 0;
}
usblp_table[usblp->minor] = NULL;
kfree(usblp);
+ MOD_DEC_USE_COUNT;
return 0;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]