usb/uas: make sure data urb is gone if we receive status before that
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 25 Jan 2012 10:48:40 +0000 (11:48 +0100)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Thu, 2 Feb 2012 22:51:30 +0000 (14:51 -0800)
commite4d8318a85779b25b880187b1b1c44e797bd7d4b
treeff7fd6fda4ad80fcf35c199e27550b3e3239152e
parentee398b59ec1dc3ce1d60518f4ea644907893414b
usb/uas: make sure data urb is gone if we receive status before that

Just run into the following:
- new disk arrived in the system
- udev couldn't wait to get its hands on to to run ata_id /dev/sda
- this sent the cdb 0xa1 to the device.
- my UAS-gadget recevied the cdb and had no idea what to do with it. It
  decided to send a status URB back with sense set to invalid opcode.
- the host side received it status and completed the scsi command.
- the host sent another scsi with 4kib data buffer
- Now I was confused why the data transfer is only 512 bytes instead of
  4kib since the host is always allocating the complete transfer in one
  go.
- Finally the system crashed while walking through the sg list.

This patch adds three new flags in order to distinguish between DATA
URB completed and outstanding. If we receive status before data, we
cancel data and let data complete the command.
This solves the problem for IN and OUT transfers but does not work for
BIDI.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
drivers/usb/storage/uas.c