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]

Reply via email to