aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2014-01-22 12:39:04 -0500
committerChristoph Hellwig <hch@lst.de>2014-07-25 07:38:41 -0400
commitd0d3bbf96ec21167e55a48ebb31912918a674e0d (patch)
treeb769066fd453a715abe19726af185d478a4ba47a /drivers/scsi/scsi.c
parentde3e8bf3315c9c7c7ffd2f9b2f299b4205feefb9 (diff)
scsi: centralize command re-queueing in scsi_dispatch_fn
Make sure we only have the logic for requeing commands in one place. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Webb Scales <webbnh@hp.com> Acked-by: Jens Axboe <axboe@kernel.dk> Tested-by: Bart Van Assche <bvanassche@acm.org> Tested-by: Robert Elliott <elliott@hp.com>
Diffstat (limited to 'drivers/scsi/scsi.c')
-rw-r--r--drivers/scsi/scsi.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 321f854947b4..2396e89dead0 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -645,9 +645,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
645 * returns an immediate error upwards, and signals 645 * returns an immediate error upwards, and signals
646 * that the device is no longer present */ 646 * that the device is no longer present */
647 cmd->result = DID_NO_CONNECT << 16; 647 cmd->result = DID_NO_CONNECT << 16;
648 scsi_done(cmd); 648 goto done;
649 /* return 0 (because the command has been processed) */
650 goto out;
651 } 649 }
652 650
653 /* Check to see if the scsi lld made this device blocked. */ 651 /* Check to see if the scsi lld made this device blocked. */
@@ -659,17 +657,9 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
659 * occur until the device transitions out of the 657 * occur until the device transitions out of the
660 * suspend state. 658 * suspend state.
661 */ 659 */
662
663 scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
664
665 SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd, 660 SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd,
666 "queuecommand : device blocked\n")); 661 "queuecommand : device blocked\n"));
667 662 return SCSI_MLQUEUE_DEVICE_BUSY;
668 /*
669 * NOTE: rtn is still zero here because we don't need the
670 * queue to be plugged on return (it's already stopped)
671 */
672 goto out;
673 } 663 }
674 664
675 /* 665 /*
@@ -693,20 +683,19 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
693 "cdb_size=%d host->max_cmd_len=%d\n", 683 "cdb_size=%d host->max_cmd_len=%d\n",
694 cmd->cmd_len, cmd->device->host->max_cmd_len)); 684 cmd->cmd_len, cmd->device->host->max_cmd_len));
695 cmd->result = (DID_ABORT << 16); 685 cmd->result = (DID_ABORT << 16);
696 686 goto done;
697 scsi_done(cmd);
698 goto out;
699 } 687 }
700 688
701 if (unlikely(host->shost_state == SHOST_DEL)) { 689 if (unlikely(host->shost_state == SHOST_DEL)) {
702 cmd->result = (DID_NO_CONNECT << 16); 690 cmd->result = (DID_NO_CONNECT << 16);
703 scsi_done(cmd); 691 goto done;
704 } else { 692
705 trace_scsi_dispatch_cmd_start(cmd);
706 cmd->scsi_done = scsi_done;
707 rtn = host->hostt->queuecommand(host, cmd);
708 } 693 }
709 694
695 trace_scsi_dispatch_cmd_start(cmd);
696
697 cmd->scsi_done = scsi_done;
698 rtn = host->hostt->queuecommand(host, cmd);
710 if (rtn) { 699 if (rtn) {
711 trace_scsi_dispatch_cmd_error(cmd, rtn); 700 trace_scsi_dispatch_cmd_error(cmd, rtn);
712 if (rtn != SCSI_MLQUEUE_DEVICE_BUSY && 701 if (rtn != SCSI_MLQUEUE_DEVICE_BUSY &&
@@ -715,12 +704,12 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
715 704
716 SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd, 705 SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd,
717 "queuecommand : request rejected\n")); 706 "queuecommand : request rejected\n"));
718
719 scsi_queue_insert(cmd, rtn);
720 } 707 }
721 708
722 out:
723 return rtn; 709 return rtn;
710 done:
711 scsi_done(cmd);
712 return 0;
724} 713}
725 714
726/** 715/**