scsi: core: Introduce enum scsi_disposition
[linux-2.6-microblaze.git] / drivers / scsi / scsi_lib.c
index 09d09ef..d7c0d5a 100644 (file)
@@ -999,8 +999,11 @@ static inline bool scsi_cmd_needs_dma_drain(struct scsi_device *sdev,
 }
 
 /**
- * scsi_alloc_sgtables - allocate S/G tables for a command
- * @cmd:  command descriptor we wish to initialize
+ * scsi_alloc_sgtables - Allocate and initialize data and integrity scatterlists
+ * @cmd: SCSI command data structure to initialize.
+ *
+ * Initializes @cmd->sdb and also @cmd->prot_sdb if data integrity is enabled
+ * for @cmd.
  *
  * Returns:
  * * BLK_STS_OK       - on success
@@ -1431,10 +1434,14 @@ static bool scsi_mq_lld_busy(struct request_queue *q)
        return false;
 }
 
-static void scsi_softirq_done(struct request *rq)
+/*
+ * Block layer request completion callback. May be called from interrupt
+ * context.
+ */
+static void scsi_complete(struct request *rq)
 {
        struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
-       int disposition;
+       enum scsi_disposition disposition;
 
        INIT_LIST_HEAD(&cmd->eh_entry);
 
@@ -1813,9 +1820,7 @@ static void scsi_mq_exit_request(struct blk_mq_tag_set *set, struct request *rq,
 
 static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
 {
-       struct request_queue *q = hctx->queue;
-       struct scsi_device *sdev = q->queuedata;
-       struct Scsi_Host *shost = sdev->host;
+       struct Scsi_Host *shost = hctx->driver_data;
 
        if (shost->hostt->mq_poll)
                return shost->hostt->mq_poll(shost, hctx->queue_num);
@@ -1823,6 +1828,15 @@ static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
        return 0;
 }
 
+static int scsi_init_hctx(struct blk_mq_hw_ctx *hctx, void *data,
+                         unsigned int hctx_idx)
+{
+       struct Scsi_Host *shost = data;
+
+       hctx->driver_data = shost;
+       return 0;
+}
+
 static int scsi_map_queues(struct blk_mq_tag_set *set)
 {
        struct Scsi_Host *shost = container_of(set, struct Scsi_Host, tag_set);
@@ -1879,7 +1893,7 @@ static const struct blk_mq_ops scsi_mq_ops_no_commit = {
        .get_budget     = scsi_mq_get_budget,
        .put_budget     = scsi_mq_put_budget,
        .queue_rq       = scsi_queue_rq,
-       .complete       = scsi_softirq_done,
+       .complete       = scsi_complete,
        .timeout        = scsi_timeout,
 #ifdef CONFIG_BLK_DEBUG_FS
        .show_rq        = scsi_show_rq,
@@ -1890,6 +1904,7 @@ static const struct blk_mq_ops scsi_mq_ops_no_commit = {
        .cleanup_rq     = scsi_cleanup_rq,
        .busy           = scsi_mq_lld_busy,
        .map_queues     = scsi_map_queues,
+       .init_hctx      = scsi_init_hctx,
        .poll           = scsi_mq_poll,
        .set_rq_budget_token = scsi_mq_set_rq_budget_token,
        .get_rq_budget_token = scsi_mq_get_rq_budget_token,
@@ -1898,9 +1913,7 @@ static const struct blk_mq_ops scsi_mq_ops_no_commit = {
 
 static void scsi_commit_rqs(struct blk_mq_hw_ctx *hctx)
 {
-       struct request_queue *q = hctx->queue;
-       struct scsi_device *sdev = q->queuedata;
-       struct Scsi_Host *shost = sdev->host;
+       struct Scsi_Host *shost = hctx->driver_data;
 
        shost->hostt->commit_rqs(shost, hctx->queue_num);
 }
@@ -1910,7 +1923,7 @@ static const struct blk_mq_ops scsi_mq_ops = {
        .put_budget     = scsi_mq_put_budget,
        .queue_rq       = scsi_queue_rq,
        .commit_rqs     = scsi_commit_rqs,
-       .complete       = scsi_softirq_done,
+       .complete       = scsi_complete,
        .timeout        = scsi_timeout,
 #ifdef CONFIG_BLK_DEBUG_FS
        .show_rq        = scsi_show_rq,
@@ -1921,6 +1934,7 @@ static const struct blk_mq_ops scsi_mq_ops = {
        .cleanup_rq     = scsi_cleanup_rq,
        .busy           = scsi_mq_lld_busy,
        .map_queues     = scsi_map_queues,
+       .init_hctx      = scsi_init_hctx,
        .poll           = scsi_mq_poll,
        .set_rq_budget_token = scsi_mq_set_rq_budget_token,
        .get_rq_budget_token = scsi_mq_get_rq_budget_token,