mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10: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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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:  [in] bio to be split
 | 
			
		||||
@ -354,7 +362,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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user