Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5d9b89b33f3ed19479dc5240986b0fedda08b82c
Commit:     5d9b89b33f3ed19479dc5240986b0fedda08b82c
Parent:     ba35e02bdcbd3a25238421a7e20efdb69436d3cf
Author:     Oliver Neukum <[EMAIL PROTECTED]>
AuthorDate: Thu Mar 1 23:07:32 2007 +0100
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Apr 27 13:28:33 2007 -0700

    USB: kill BKL in skeleton driver
    
    Iet's kill BKL where we can. This is relative to the last patch to the
    skeleton driver.
    
    Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/usb-skeleton.c |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c
index 962b28c..8432bf1 100644
--- a/drivers/usb/usb-skeleton.c
+++ b/drivers/usb/usb-skeleton.c
@@ -34,6 +34,9 @@ static struct usb_device_id skel_table [] = {
 };
 MODULE_DEVICE_TABLE(usb, skel_table);
 
+/* to prevent a race between open and disconnect */
+static DEFINE_MUTEX(skel_open_lock);
+
 
 /* Get a minor range for your devices from the usb maintainer */
 #define USB_SKEL_MINOR_BASE    192
@@ -80,8 +83,10 @@ static int skel_open(struct inode *inode, struct file *file)
 
        subminor = iminor(inode);
 
+       mutex_lock(&skel_open_lock);
        interface = usb_find_interface(&skel_driver, subminor);
        if (!interface) {
+               mutex_unlock(&skel_open_lock);
                err ("%s - error, can't find device for minor %d",
                     __FUNCTION__, subminor);
                retval = -ENODEV;
@@ -90,12 +95,15 @@ static int skel_open(struct inode *inode, struct file *file)
 
        dev = usb_get_intfdata(interface);
        if (!dev) {
+               mutex_unlock(&skel_open_lock);
                retval = -ENODEV;
                goto exit;
        }
 
        /* increment our usage count for the device */
        kref_get(&dev->kref);
+       /* now we can drop the lock */
+       mutex_unlock(&skel_open_lock);
 
        /* prevent the device from being autosuspended */
        retval = usb_autopm_get_interface(interface);
@@ -361,14 +369,14 @@ static void skel_disconnect(struct usb_interface 
*interface)
        int minor = interface->minor;
 
        /* prevent skel_open() from racing skel_disconnect() */
-       lock_kernel();
+       mutex_lock(&skel_open_lock);
 
        dev = usb_get_intfdata(interface);
        usb_set_intfdata(interface, NULL);
 
        /* give back our minor */
        usb_deregister_dev(interface, &skel_class);
-       unlock_kernel();
+       mutex_unlock(&skel_open_lock);
 
        /* prevent more I/O from starting */
        mutex_lock(&dev->io_mutex);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to