aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_error.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/scsi_error.c')
-rw-r--r--drivers/scsi/scsi_error.c32
1 files changed, 4 insertions, 28 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index f3cf924a2cd9..30ac116186f5 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -615,7 +615,7 @@ static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
615 return rtn; 615 return rtn;
616} 616}
617 617
618static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd) 618static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
619{ 619{
620 if (!scmd->device->host->hostt->eh_abort_handler) 620 if (!scmd->device->host->hostt->eh_abort_handler)
621 return FAILED; 621 return FAILED;
@@ -623,31 +623,9 @@ static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
623 return scmd->device->host->hostt->eh_abort_handler(scmd); 623 return scmd->device->host->hostt->eh_abort_handler(scmd);
624} 624}
625 625
626/**
627 * scsi_try_to_abort_cmd - Ask host to abort a running command.
628 * @scmd: SCSI cmd to abort from Lower Level.
629 *
630 * Notes:
631 * This function will not return until the user's completion function
632 * has been called. there is no timeout on this operation. if the
633 * author of the low-level driver wishes this operation to be timed,
634 * they can provide this facility themselves. helper functions in
635 * scsi_error.c can be supplied to make this easier to do.
636 */
637static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
638{
639 /*
640 * scsi_done was called just after the command timed out and before
641 * we had a chance to process it. (db)
642 */
643 if (scmd->serial_number == 0)
644 return SUCCESS;
645 return __scsi_try_to_abort_cmd(scmd);
646}
647
648static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd) 626static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
649{ 627{
650 if (__scsi_try_to_abort_cmd(scmd) != SUCCESS) 628 if (scsi_try_to_abort_cmd(scmd) != SUCCESS)
651 if (scsi_try_bus_device_reset(scmd) != SUCCESS) 629 if (scsi_try_bus_device_reset(scmd) != SUCCESS)
652 if (scsi_try_target_reset(scmd) != SUCCESS) 630 if (scsi_try_target_reset(scmd) != SUCCESS)
653 if (scsi_try_bus_reset(scmd) != SUCCESS) 631 if (scsi_try_bus_reset(scmd) != SUCCESS)
@@ -773,17 +751,15 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
773 struct Scsi_Host *shost = sdev->host; 751 struct Scsi_Host *shost = sdev->host;
774 DECLARE_COMPLETION_ONSTACK(done); 752 DECLARE_COMPLETION_ONSTACK(done);
775 unsigned long timeleft; 753 unsigned long timeleft;
776 unsigned long flags;
777 struct scsi_eh_save ses; 754 struct scsi_eh_save ses;
778 int rtn; 755 int rtn;
779 756
780 scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes); 757 scsi_eh_prep_cmnd(scmd, &ses, cmnd, cmnd_size, sense_bytes);
781 shost->eh_action = &done; 758 shost->eh_action = &done;
782 759
783 spin_lock_irqsave(shost->host_lock, flags);
784 scsi_log_send(scmd); 760 scsi_log_send(scmd);
785 shost->hostt->queuecommand(scmd, scsi_eh_done); 761 scmd->scsi_done = scsi_eh_done;
786 spin_unlock_irqrestore(shost->host_lock, flags); 762 shost->hostt->queuecommand(shost, scmd);
787 763
788 timeleft = wait_for_completion_timeout(&done, timeout); 764 timeleft = wait_for_completion_timeout(&done, timeout);
789 765