In the case of a ZBC disk used with scsi-mq, zone write locking does not prevent write reordering in sequential zones. Unlike the legacy case, zone locking is done after the command request is removed from the scheduler dispatch queue. That is, at the time of zone locking, the write command may already be out of order, making locking ineffective. Write order guarantees can only be provided by an adapted I/O scheduler. Disable zone write locking in sd_zbc_write_lock_zone() if the disk is used with scsi-mq. As the disk zones_wlock bitmap is not necessry, do not allocate it. Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> Reviewed-by: Bart Van Assche <Bart.VanAssche@xxxxxxx> Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx> --- drivers/scsi/sd_zbc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index 9bc0bde596e3..34576fb31f3a 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c @@ -314,6 +314,10 @@ int sd_zbc_write_lock_zone(struct scsi_cmnd *cmd) (sector & (zone_sectors - 1)) + blk_rq_sectors(rq) > zone_sectors) return BLKPREP_KILL; + /* No write locking with scsi-mq */ + if (q->mq_ops) + return BLKPREP_OK; + /* * There is no write constraints on conventional zones. So any write * command can be sent. But do not issue more than one write command @@ -713,7 +717,8 @@ static int sd_zbc_setup(struct scsi_disk *sdkp) if (sdkp->first_scan) return 0; - if (!sdkp->zones_wlock || q->nr_zones != sdkp->nr_zones) { + if (!q->mq_ops && + (!sdkp->zones_wlock || q->nr_zones != sdkp->nr_zones)) { kfree(sdkp->zones_wlock); sdkp->zones_wlock = sd_zbc_alloc_zone_bitmap(sdkp); if (!sdkp->zones_wlock) -- 2.13.5