diff options
| author | Christoph Hellwig <hch@lst.de> | 2024-11-04 07:26:30 +0100 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-12-09 10:31:45 +0100 |
| commit | fad4262bd40d736953e6fe262db51636ab3aca4f (patch) | |
| tree | 3836fbef81ac2eb2ddc6f8cd925453a9cc72d55d /block | |
| parent | 539fabba965e119b98066fc6ba5257b5eaf4eda2 (diff) | |
| download | linux-fad4262bd40d736953e6fe262db51636ab3aca4f.tar.gz linux-fad4262bd40d736953e6fe262db51636ab3aca4f.tar.bz2 linux-fad4262bd40d736953e6fe262db51636ab3aca4f.zip | |
block: fix bio_split_rw_at to take zone_write_granularity into account
[ Upstream commit 7ecd2cd4fae3e8410c0a6620f3a83dcdbb254f02 ]
Otherwise it can create unaligned writes on zoned devices.
Fixes: a805a4fa4fa3 ("block: introduce zone_write_granularity limit")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20241104062647.91160-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-merge.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index 07bf758c523a..889ac59759a2 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -256,6 +256,14 @@ static bool bvec_split_segs(const struct queue_limits *lim, return len > 0 || bv->bv_len > max_len; } +static unsigned int bio_split_alignment(struct bio *bio, + const struct queue_limits *lim) +{ + if (op_is_write(bio_op(bio)) && lim->zone_write_granularity) + return lim->zone_write_granularity; + return lim->logical_block_size; +} + /** * bio_split_rw - split a bio in two bios * @bio: [in] bio to be split @@ -326,7 +334,7 @@ split: * split size so that each bio is properly block size aligned, even if * we do not use the full hardware limits. */ - bytes = ALIGN_DOWN(bytes, lim->logical_block_size); + bytes = ALIGN_DOWN(bytes, bio_split_alignment(bio, lim)); /* * Bio splitting may cause subtle trouble such as hang when doing sync |
