mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
block: fix bio_split_rw_at to take zone_write_granularity into account
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>
This commit is contained in:
parent
60dc5ea6bc
commit
7ecd2cd4fa
@ -292,6 +292,14 @@ static bool bvec_split_segs(const struct queue_limits *lim,
|
|||||||
return len > 0 || bv->bv_len > max_len;
|
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_at - check if and where to split a read/write bio
|
* bio_split_rw_at - check if and where to split a read/write bio
|
||||||
* @bio: [in] bio to be split
|
* @bio: [in] bio to be split
|
||||||
@ -354,7 +362,7 @@ split:
|
|||||||
* split size so that each bio is properly block size aligned, even if
|
* split size so that each bio is properly block size aligned, even if
|
||||||
* we do not use the full hardware limits.
|
* 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
|
* Bio splitting may cause subtle trouble such as hang when doing sync
|
||||||
|
Loading…
Reference in New Issue
Block a user