From: Li Nan <linan122@xxxxxxxxxx> Badblocks are arranged from small to large, but order of badblocks will be reversed if we set a large area at once as below: $ echo 0 2048 > bad_blocks $ cat bad_blocks 1536 512 1024 512 512 512 0 512 Actually, it should be: $ echo 0 2048 > bad_blocks $ cat bad_blocks 0 512 512 512 1024 512 1536 512 'hi' remains unchanged while setting continuous badblocks is wrong, the next badblocks is greater than 'p[hi]', and it should be added to 'p[hi+1]'. Let 'hi' +1 each cycle. (0 512) 0 512 |_________| |_________| p[hi] p[hi] (512 512) (0 512) fix 0 512 1024 |_________|_________| ===> |_________|_________| p[hi] p[hi+1] (1024 512)(512 512) (0 512) 0 512 1024 1536 |_________|_________|_________| |_________|_________|_________| p[hi] p[hi+2] ... Fixes: 9e0e252a048b ("badblocks: Add core badblock management code") Signed-off-by: Li Nan <linan122@xxxxxxxxxx> --- block/badblocks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/badblocks.c b/block/badblocks.c index c1745b76d8f1..b79d37a4bf0e 100644 --- a/block/badblocks.c +++ b/block/badblocks.c @@ -301,6 +301,7 @@ int badblocks_set(struct badblocks *bb, sector_t s, int sectors, p[hi] = BB_MAKE(s, this_sectors, acknowledged); sectors -= this_sectors; s += this_sectors; + hi++; changed = true; } } -- 2.39.2