[SCSI] libsas: fix timeout vs completion race
authorDan Williams <dan.j.williams@intel.com>
Mon, 28 Nov 2011 19:29:20 +0000 (11:29 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 20:06:08 +0000 (14:06 -0600)
commit9095a64a9aead653df320e3a6fc70835c15d46e4
tree63ad804f78668bf28d90ea2f8c9640ce92dacdea
parenta3a142524aa4b1539a64a55087bf12ffa4b1f94e
[SCSI] libsas: fix timeout vs completion race

Until we have told the lldd to forget a task a timed out operation can
return from the hardware at any time.  Since completion frees the task
we need to make sure that no tasks run their normal completion handler
once eh has decided to manage the task.  Similar to
ata_scsi_cmd_error_handler() freeze completions to let eh judge the
outcome of the race.

Task collector mode is problematic because it presents a situation where
a task can be timed out and aborted before the lldd has even seen it.
For this case we need to guarantee that a task that an lldd has been
told to forget does not get queued after the lldd says "never seen it".
With sas_scsi_timed_out we achieve this with the ->task_queue_flush
mutex, rather than adding more time.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/libsas/sas_ata.c
drivers/scsi/libsas/sas_internal.h
drivers/scsi/libsas/sas_scsi_host.c
include/scsi/libsas.h
include/scsi/sas_ata.h