diff options
author | Damien Le Moal <damien.lemoal@opensource.wdc.com> | 2022-06-02 15:03:44 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-06-02 16:11:28 +0300 |
commit | aacae8c469f9ce4b303a2eb61593ff522c1420bc (patch) | |
tree | 6493baa81013cfe7bf690157723e390eec42dcf6 /drivers/block/null_blk/zoned.c | |
parent | c9fdf7b453874e37ff4c499140ba2ab56fa0c7e5 (diff) | |
download | linux-aacae8c469f9ce4b303a2eb61593ff522c1420bc.tar.xz |
block: null_blk: Fix null_zone_write()
The bio and rq fields of struct nullb_cmd are now overlapping in a
union. So we cannot use a test on ->bio being non-NULL to detect the
NULL_Q_BIO queue mode. null_zone_write() use such broken test to set the
sector position of a zone append write in the command bio or request.
When the null_blk device uses the NULL_Q_MQ queue mode,
null_zone_write() wrongly end up setting the bio sector position,
resulting in the command request to be broken and random crashes
following.
Fix this by testing the device queue mode directly.
Fixes: 8ba816b23abd ("null-blk: save memory footprint for struct nullb_cmd")
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20220602120344.1365329-1-damien.lemoal@opensource.wdc.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/null_blk/zoned.c')
-rw-r--r-- | drivers/block/null_blk/zoned.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/block/null_blk/zoned.c b/drivers/block/null_blk/zoned.c index ed158ea4fdd1..2fdd7b20c224 100644 --- a/drivers/block/null_blk/zoned.c +++ b/drivers/block/null_blk/zoned.c @@ -398,10 +398,10 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector, */ if (append) { sector = zone->wp; - if (cmd->bio) - cmd->bio->bi_iter.bi_sector = sector; - else + if (dev->queue_mode == NULL_Q_MQ) cmd->rq->__sector = sector; + else + cmd->bio->bi_iter.bi_sector = sector; } else if (sector != zone->wp) { ret = BLK_STS_IOERR; goto unlock; |