# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.688   -> 1.689  
#       drivers/usb/hpusbscsi.c 1.8     -> 1.9    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/26      [EMAIL PROTECTED]      1.689
# [PATCH] USB: update of hpusbscsi
# 
# this fixes an unplugging problem and an SMP deadlock.
# --------------------------------------------
#
diff -Nru a/drivers/usb/hpusbscsi.c b/drivers/usb/hpusbscsi.c
--- a/drivers/usb/hpusbscsi.c   Mon Sep 30 10:47:06 2002
+++ b/drivers/usb/hpusbscsi.c   Mon Sep 30 10:47:06 2002
@@ -200,8 +200,14 @@
 static void
 hpusbscsi_usb_disconnect (struct usb_device *dev, void *ptr)
 {
-                 usb_unlink_urb(&(((struct hpusbscsi *) ptr)->controlurb));
-       ((struct hpusbscsi *) ptr)->dev = NULL;
+       struct hpusbscsi *hp = (struct hpusbscsi *)ptr;
+
+       usb_unlink_urb(&hp->controlurb);
+       usb_unlink_urb(&hp->dataurb);
+
+       spin_lock_irq(&io_request_lock);
+       hp->dev = NULL;
+       spin_unlock_irq(&io_request_lock);
 }
 
 static struct usb_device_id hpusbscsi_usb_ids[] = {
@@ -335,15 +341,13 @@
        usb_urb_callback usb_callback;
        int res;
 
-       hpusbscsi->use_count++;
+       spin_unlock_irq(&io_request_lock);
 
        /* we don't answer for anything but our single device on any faked host 
controller */
        if ( srb->device->lun || srb->device->id || srb->device->channel ) {
-               if (callback) {
-                       srb->result = DID_BAD_TARGET;
-                       callback(srb);
-               }
-                       goto out;
+               srb->result = DID_BAD_TARGET;
+               callback(srb);
+               goto out;
        }
 
        /* Now we need to decide which callback to give to the urb we send the command 
with */
@@ -407,14 +411,13 @@
        if (res) {
                hpusbscsi->state = HP_STATE_FREE;
                PDEBUG(2, "state= %s", states[hpusbscsi->state]);
-               if (callback) {
-                       srb->result = DID_ERROR;
-                       callback(srb);
-               }
+               srb->result = DID_ERROR;
+               callback(srb);
+
        }
 
 out:
-       hpusbscsi->use_count--;
+       spin_lock_irq(&io_request_lock);
        return 0;
 }
 
@@ -438,7 +441,7 @@
        spin_unlock_irq(&io_request_lock);
        usb_unlink_urb(&hpusbscsi->dataurb);
        hpusbscsi->state = HP_STATE_FREE;
-       
+
        spin_lock_irq(&io_request_lock);
 
        return SCSI_ABORT_PENDING;


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to