scsi: sd_zbc: factor out sanity checks for zoned commands
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Tue, 12 May 2020 08:55:50 +0000 (17:55 +0900)
committerJens Axboe <axboe@kernel.dk>
Wed, 13 May 2020 02:36:28 +0000 (20:36 -0600)
Factor sanity checks for zoned commands from sd_zbc_setup_zone_mgmt_cmnd().

This will help with the introduction of an emulated ZONE_APPEND command.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/scsi/sd_zbc.c

index f45c22b..ee156fb 100644 (file)
@@ -209,6 +209,26 @@ out:
        return ret;
 }
 
+static blk_status_t sd_zbc_cmnd_checks(struct scsi_cmnd *cmd)
+{
+       struct request *rq = cmd->request;
+       struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
+       sector_t sector = blk_rq_pos(rq);
+
+       if (!sd_is_zoned(sdkp))
+               /* Not a zoned device */
+               return BLK_STS_IOERR;
+
+       if (sdkp->device->changed)
+               return BLK_STS_IOERR;
+
+       if (sector & (sd_zbc_zone_sectors(sdkp) - 1))
+               /* Unaligned request */
+               return BLK_STS_IOERR;
+
+       return BLK_STS_OK;
+}
+
 /**
  * sd_zbc_setup_zone_mgmt_cmnd - Prepare a zone ZBC_OUT command. The operations
  *                     can be RESET WRITE POINTER, OPEN, CLOSE or FINISH.
@@ -223,20 +243,14 @@ blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd,
                                         unsigned char op, bool all)
 {
        struct request *rq = cmd->request;
-       struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
        sector_t sector = blk_rq_pos(rq);
+       struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
        sector_t block = sectors_to_logical(sdkp->device, sector);
+       blk_status_t ret;
 
-       if (!sd_is_zoned(sdkp))
-               /* Not a zoned device */
-               return BLK_STS_IOERR;
-
-       if (sdkp->device->changed)
-               return BLK_STS_IOERR;
-
-       if (sector & (sd_zbc_zone_sectors(sdkp) - 1))
-               /* Unaligned request */
-               return BLK_STS_IOERR;
+       ret = sd_zbc_cmnd_checks(cmd);
+       if (ret != BLK_STS_OK)
+               return ret;
 
        cmd->cmd_len = 16;
        memset(cmd->cmnd, 0, cmd->cmd_len);