scsi: sd_zbc: factor out sanity checks for zoned commands
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>
This commit is contained in:
parent
e732671aa5
commit
02494d35ba
@ -209,6 +209,26 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
|
|||||||
return ret;
|
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
|
* sd_zbc_setup_zone_mgmt_cmnd - Prepare a zone ZBC_OUT command. The operations
|
||||||
* can be RESET WRITE POINTER, OPEN, CLOSE or FINISH.
|
* 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)
|
unsigned char op, bool all)
|
||||||
{
|
{
|
||||||
struct request *rq = cmd->request;
|
struct request *rq = cmd->request;
|
||||||
struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
|
|
||||||
sector_t sector = blk_rq_pos(rq);
|
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);
|
sector_t block = sectors_to_logical(sdkp->device, sector);
|
||||||
|
blk_status_t ret;
|
||||||
|
|
||||||
if (!sd_is_zoned(sdkp))
|
ret = sd_zbc_cmnd_checks(cmd);
|
||||||
/* Not a zoned device */
|
if (ret != BLK_STS_OK)
|
||||||
return BLK_STS_IOERR;
|
return ret;
|
||||||
|
|
||||||
if (sdkp->device->changed)
|
|
||||||
return BLK_STS_IOERR;
|
|
||||||
|
|
||||||
if (sector & (sd_zbc_zone_sectors(sdkp) - 1))
|
|
||||||
/* Unaligned request */
|
|
||||||
return BLK_STS_IOERR;
|
|
||||||
|
|
||||||
cmd->cmd_len = 16;
|
cmd->cmd_len = 16;
|
||||||
memset(cmd->cmnd, 0, cmd->cmd_len);
|
memset(cmd->cmnd, 0, cmd->cmd_len);
|
||||||
|
Loading…
Reference in New Issue
Block a user