Patch regression - Re: [PATCH 5.10 070/104] dm snapshot: fix a crash when an origin has no snapshots
From: Mikulas Patocka
Date: Tue May 25 2021 - 07:37:11 EST
Hi Greg
I'd like to ask you to drop this patch from all stable branches.
It causes regression with snapshot merging and the regression is much
worse than the bug that it fixes.
Mikulas
On Mon, 24 May 2021, Greg Kroah-Hartman wrote:
> From: Mikulas Patocka <mpatocka@xxxxxxxxxx>
>
> commit 7ee06ddc4038f936b0d4459d37a7d4d844fb03db upstream.
>
> If an origin target has no snapshots, o->split_boundary is set to 0.
> This causes BUG_ON(sectors <= 0) in block/bio.c:bio_split().
>
> Fix this by initializing chunk_size, and in turn split_boundary, to
> rounddown_pow_of_two(UINT_MAX) -- the largest power of two that fits
> into "unsigned" type.
>
> Reported-by: Michael Tokarev <mjt@xxxxxxxxxx>
> Tested-by: Michael Tokarev <mjt@xxxxxxxxxx>
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx>
> Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx>
> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> ---
> drivers/md/dm-snap.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> --- a/drivers/md/dm-snap.c
> +++ b/drivers/md/dm-snap.c
> @@ -854,12 +854,11 @@ static int dm_add_exception(void *contex
> static uint32_t __minimum_chunk_size(struct origin *o)
> {
> struct dm_snapshot *snap;
> - unsigned chunk_size = 0;
> + unsigned chunk_size = rounddown_pow_of_two(UINT_MAX);
>
> if (o)
> list_for_each_entry(snap, &o->snapshots, list)
> - chunk_size = min_not_zero(chunk_size,
> - snap->store->chunk_size);
> + chunk_size = min(chunk_size, snap->store->chunk_size);
>
> return (uint32_t) chunk_size;
> }
>
>