On Sun, May 30, 2004 at 02:52:27PM -0400, Alan Stern wrote: > On Sun, 30 May 2004, Vojtech Pavlik wrote: > > > Okay, so can we all agree on this one? > > I don't know if it's really needed, but for consistency you might want to > make a similar change around the call to usb_stor_Bulk_transport() near > the start of isd200_invoke_transport() in isd200.c. > > Apart from that minor point, this looks okay to me.
Ok, so here goes the final version. Greg, please apply. -- Vojtech Pavlik SuSE Labs, SuSE CR
[EMAIL PROTECTED], 2004-05-30 22:43:21+02:00, [EMAIL PROTECTED] usb: Based on a 2.4 patch from [EMAIL PROTECTED], this patch serializes usb storage and usbfs operation, so that usbfs cannot disturb storage by seemingly harmless control reads. Signed-off-by: Vojtech Pavlik <[EMAIL PROTECTED]> transport.c | 11 +++++++++++ isd200.c | 4 ++++ 2 files changed, 15 insertions(+) diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c --- a/drivers/usb/storage/transport.c 2004-05-30 18:13:33 +02:00 +++ b/drivers/usb/storage/transport.c 2004-05-30 18:13:33 +02:00 @@ -527,9 +527,18 @@ int need_auto_sense; int result; + /* + * Grab device's serialize mutex to prevent /usbfs and others from + * sending out a command in the middle of ours (if libusb sends a + * get_descriptor or something on pipe 0 after our CBW and before + * our CSW, and then we get a stall, we have trouble) + */ + /* send the command to the transport layer */ + down(&(us->pusb_dev->serialize)); srb->resid = 0; result = us->transport(srb, us); + up(&(us->pusb_dev->serialize)); /* if the command gets aborted by the higher layers, we need to * short-circuit all other processing @@ -648,9 +657,11 @@ srb->serial_number ^= 0x80000000; /* issue the auto-sense command */ + down(&(us->pusb_dev->serialize)); old_resid = srb->resid; srb->resid = 0; temp_result = us->transport(us->srb, us); + up(&(us->pusb_dev->serialize)); /* let's clean up right away */ srb->resid = old_resid; --- a/drivers/usb/storage/isd200.c 2004-05-30 22:42:13 +02:00 +++ b/drivers/usb/storage/isd200.c 2004-05-30 22:42:13 +02:00 @@ -485,7 +485,9 @@ memcpy(srb->cmnd, &ata, sizeof(ata.generic)); srb->cmd_len = sizeof(ata.generic); + down(&(us->pusb_dev->serialize)); status = usb_stor_Bulk_transport(srb, us); + up(&(us->pusb_dev->serialize)); if (status == USB_STOR_TRANSPORT_GOOD) status = ISD200_GOOD; else { @@ -545,7 +547,9 @@ /* send the command to the transport layer */ memcpy(srb->cmnd, ataCdb, sizeof(ataCdb->generic)); srb->cmd_len = sizeof(ataCdb->generic); + down(&(us->pusb_dev->serialize)); transferStatus = usb_stor_Bulk_transport(srb, us); + up(&(us->pusb_dev->serialize)); /* if the command gets aborted by the higher layers, we need to * short-circuit all other processing Signed-off-by: Vojtech Pavlik <[EMAIL PROTECTED]>