[SCSI] libsas: Reset timer on taskless scsi_cmnds in sas_scsi_timed_out
authorDarrick J. Wong <djwong@us.ibm.com>
Thu, 11 Jan 2007 22:15:00 +0000 (14:15 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sat, 13 Jan 2007 22:13:38 +0000 (16:13 -0600)
commit6d4dcd4dae25c48e8932326aaedfe560d7f2c7bb
tree4ab6566de836ff50931ee7487d7e7c7ad6d11b39
parentacbf167d4ad8c27f9743a4b539d51ae9535bf21c
[SCSI] libsas: Reset timer on taskless scsi_cmnds in sas_scsi_timed_out

Every so often, a scsi_cmnd will time out, and the libsas timeout handler
will discover that the scsi_cmnd does not have a sas_task attached to it.
This can happen in two cases: (1) the scsi_cmnd actually made it through
libsas to the HBA and is now going through scsi_done, or (2) the
scsi_cmnd has been held up (host lock, slab alloc, etc) and libsas has
not yet attached a sas_task.  In both cases, it is safe to ask SCSI for
more time to process the command via EH_RESET_TIMER; we cannot blindly
return EH_HANDLED because if (2) happens, we could end up calling
scsi_done while another CPU is heading towards sas_queuecommand, which
causes slab corruption when sas_task_done updates the freed scsi_cmnd.

Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/libsas/sas_scsi_host.c