block: fix bio_split_rw_at to take zone_write_granularity into account

BugLink: https://bugs.launchpad.net/bugs/2101915

[ Upstream commit 7ecd2cd4fae3e8410c0a6620f3a83dcdbb254f02 ]

Otherwise it can create unaligned writes on zoned devices.

Fixes: a805a4fa4f ("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>
Signed-off-by: Koichiro Den <koichiro.den@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
Christoph Hellwig
2025-03-11 08:51:19 +09:00
committed by Stefan Bader
parent 42e102266a
commit 2a6e6372e7
+9 -1
View File
@@ -252,6 +252,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
@@ -322,7 +330,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