]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/scsi/scsi_lib.c
scsi: simplify scsi_prep_state_check
[linux.git] / drivers / scsi / scsi_lib.c
index 651be30ba96a3e41d42c413835f5def294dc2c38..5ecabb3e77b750c10215e9b1dc889e279801fa77 100644 (file)
@@ -1240,60 +1240,48 @@ static int scsi_setup_cmnd(struct scsi_device *sdev, struct request *req)
                return scsi_setup_fs_cmnd(sdev, req);
 }
 
-static int
+static blk_status_t
 scsi_prep_state_check(struct scsi_device *sdev, struct request *req)
 {
-       int ret = BLKPREP_OK;
-
-       /*
-        * If the device is not in running state we will reject some
-        * or all commands.
-        */
-       if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
-               switch (sdev->sdev_state) {
-               case SDEV_OFFLINE:
-               case SDEV_TRANSPORT_OFFLINE:
-                       /*
-                        * If the device is offline we refuse to process any
-                        * commands.  The device must be brought online
-                        * before trying any recovery commands.
-                        */
-                       sdev_printk(KERN_ERR, sdev,
-                                   "rejecting I/O to offline device\n");
-                       ret = BLKPREP_KILL;
-                       break;
-               case SDEV_DEL:
-                       /*
-                        * If the device is fully deleted, we refuse to
-                        * process any commands as well.
-                        */
-                       sdev_printk(KERN_ERR, sdev,
-                                   "rejecting I/O to dead device\n");
-                       ret = BLKPREP_KILL;
-                       break;
-               case SDEV_BLOCK:
-               case SDEV_CREATED_BLOCK:
-                       ret = BLKPREP_DEFER;
-                       break;
-               case SDEV_QUIESCE:
-                       /*
-                        * If the devices is blocked we defer normal commands.
-                        */
-                       if (req && !(req->rq_flags & RQF_PREEMPT))
-                               ret = BLKPREP_DEFER;
-                       break;
-               default:
-                       /*
-                        * For any other not fully online state we only allow
-                        * special commands.  In particular any user initiated
-                        * command is not allowed.
-                        */
-                       if (req && !(req->rq_flags & RQF_PREEMPT))
-                               ret = BLKPREP_KILL;
-                       break;
-               }
+       switch (sdev->sdev_state) {
+       case SDEV_OFFLINE:
+       case SDEV_TRANSPORT_OFFLINE:
+               /*
+                * If the device is offline we refuse to process any
+                * commands.  The device must be brought online
+                * before trying any recovery commands.
+                */
+               sdev_printk(KERN_ERR, sdev,
+                           "rejecting I/O to offline device\n");
+               return BLK_STS_IOERR;
+       case SDEV_DEL:
+               /*
+                * If the device is fully deleted, we refuse to
+                * process any commands as well.
+                */
+               sdev_printk(KERN_ERR, sdev,
+                           "rejecting I/O to dead device\n");
+               return BLK_STS_IOERR;
+       case SDEV_BLOCK:
+       case SDEV_CREATED_BLOCK:
+               return BLK_STS_RESOURCE;
+       case SDEV_QUIESCE:
+               /*
+                * If the devices is blocked we defer normal commands.
+                */
+               if (req && !(req->rq_flags & RQF_PREEMPT))
+                       return BLK_STS_RESOURCE;
+               return BLK_STS_OK;
+       default:
+               /*
+                * For any other not fully online state we only allow
+                * special commands.  In particular any user initiated
+                * command is not allowed.
+                */
+               if (req && !(req->rq_flags & RQF_PREEMPT))
+                       return BLK_STS_IOERR;
+               return BLK_STS_OK;
        }
-       return ret;
 }
 
 /*
@@ -1700,9 +1688,15 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
        blk_status_t ret;
        int reason;
 
-       ret = prep_to_mq(scsi_prep_state_check(sdev, req));
-       if (ret != BLK_STS_OK)
-               goto out_put_budget;
+       /*
+        * If the device is not in running state we will reject some or all
+        * commands.
+        */
+       if (unlikely(sdev->sdev_state != SDEV_RUNNING)) {
+               ret = scsi_prep_state_check(sdev, req);
+               if (ret != BLK_STS_OK)
+                       goto out_put_budget;
+       }
 
        ret = BLK_STS_RESOURCE;
        if (!scsi_target_queue_ready(shost, sdev))
@@ -1812,7 +1806,7 @@ static int scsi_map_queues(struct blk_mq_tag_set *set)
 
        if (shost->hostt->map_queues)
                return shost->hostt->map_queues(shost);
-       return blk_mq_map_queues(set);
+       return blk_mq_map_queues(&set->map[0]);
 }
 
 void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)