scsi: simplify scsi_prep_state_check
authorChristoph Hellwig <hch@lst.de>
Fri, 9 Nov 2018 13:42:36 +0000 (14:42 +0100)
committerJens Axboe <axboe@kernel.dk>
Sat, 10 Nov 2018 02:17:13 +0000 (19:17 -0700)
Return a blk_status_t directly, and make the code a little more compact
by handling the fast path in the caller.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/scsi/scsi_lib.c

index ed81b8e74cfee9a1bb07e6208222035fb7ad7b4d..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))