diff options
author | Hannes Reinecke <hare@suse.de> | 2017-06-30 19:18:12 +0200 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2017-08-07 14:04:00 -0400 |
commit | e7e99d60ce63640b1f38e792c4931dd525c2fa1a (patch) | |
tree | 6528b219d03e342337adb0bf261ee4b82a3854b2 /drivers/scsi/aacraid | |
parent | c323eab7a6bd20ee65e58ac23301bd98c32bf65d (diff) | |
download | talos-op-linux-e7e99d60ce63640b1f38e792c4931dd525c2fa1a.tar.gz talos-op-linux-e7e99d60ce63640b1f38e792c4931dd525c2fa1a.zip |
scsi: aacraid: complete all commands during bus reset
When issuing a bus reset we should complete all commands, not
just the command triggering the reset.
Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/aacraid')
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index e5d2d9179469..a8dedc3cdf12 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -1010,23 +1010,29 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd) struct Scsi_Host * host = dev->host; struct aac_dev * aac = (struct aac_dev *)host->hostdata; int count; - u32 bus, cid; + u32 cmd_bus; int status = 0; - bus = aac_logical_to_phys(scmd_channel(cmd)); - cid = scmd_id(cmd); - if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || - aac->hba_map[bus][cid].devtype != AAC_DEVTYPE_NATIVE_RAW) { - /* Mark the assoc. FIB to not complete, eh handler does this */ - for (count = 0; - count < (host->can_queue + AAC_NUM_MGT_FIB); - ++count) { - struct fib *fib = &aac->fibs[count]; - - if (fib->hw_fib_va->header.XferState && - (fib->flags & FIB_CONTEXT_FLAG) && - (fib->callback_data == cmd)) { + cmd_bus = aac_logical_to_phys(scmd_channel(cmd)); + /* Mark the assoc. FIB to not complete, eh handler does this */ + for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { + struct fib *fib = &aac->fibs[count]; + + if (fib->hw_fib_va->header.XferState && + (fib->flags & FIB_CONTEXT_FLAG) && + (fib->flags & FIB_CONTEXT_FLAG_SCSI_CMD)) { + struct aac_hba_map_info *info; + u32 bus, cid; + + cmd = (struct scsi_cmnd *)fib->callback_data; + bus = aac_logical_to_phys(scmd_channel(cmd)); + if (bus != cmd_bus) + continue; + cid = scmd_id(cmd); + info = &aac->hba_map[bus][cid]; + if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || + info->devtype != AAC_DEVTYPE_NATIVE_RAW) { fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER; } |