Skip to content

Commit 7e7986f

Browse files
snitmaxboe
authored andcommitted
block: use gcd() to fix chunk_sectors limit stacking
commit 22ada80 ("block: use lcm_not_zero() when stacking chunk_sectors") broke chunk_sectors limit stacking. chunk_sectors must reflect the most limited of all devices in the IO stack. Otherwise malformed IO may result. E.g.: prior to this fix, ->chunk_sectors = lcm_not_zero(8, 128) would result in blk_max_size_offset() splitting IO at 128 sectors rather than the required more restrictive 8 sectors. And since commit 07d098e ("block: allow 'chunk_sectors' to be non-power-of-2") care must be taken to properly stack chunk_sectors to be compatible with the possibility that a non-power-of-2 chunk_sectors may be stacked. This is why gcd() is used instead of reverting back to using min_not_zero(). Fixes: 22ada80 ("block: use lcm_not_zero() when stacking chunk_sectors") Fixes: 07d098e ("block: allow 'chunk_sectors' to be non-power-of-2") Reported-by: John Dorminy <[email protected]> Reported-by: Bruce Johnston <[email protected]> Signed-off-by: Mike Snitzer <[email protected]> Reviewed-by: John Dorminy <[email protected]> Cc: [email protected] Reviewed-by: Martin K. Petersen <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 47a8465 commit 7e7986f

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

block/blk-settings.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,10 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
547547

548548
t->io_min = max(t->io_min, b->io_min);
549549
t->io_opt = lcm_not_zero(t->io_opt, b->io_opt);
550-
t->chunk_sectors = lcm_not_zero(t->chunk_sectors, b->chunk_sectors);
550+
551+
/* Set non-power-of-2 compatible chunk_sectors boundary */
552+
if (b->chunk_sectors)
553+
t->chunk_sectors = gcd(t->chunk_sectors, b->chunk_sectors);
551554

552555
/* Physical block size a multiple of the logical block size? */
553556
if (t->physical_block_size & (t->logical_block_size - 1)) {

0 commit comments

Comments
 (0)