On Thu, Jan 08, 2026 at 08:55:08PM +0100, Mikulas Patocka wrote:
> The function dm_blk_report_zones tests if the device is suspended with
> the "dm_suspended_md" call. However, this function is called without
> holding any locks, so the device may be suspended just after it.
> 
> Move the call to dm_suspended_md after dm_get_live_table, so that the
> device can't be suspended after the suspended state was tested.
> 
> Signed-off-by: Mikulas Patocka <[email protected]>
> Fixes: 37f53a2c60d0 ("dm: fix dm_blk_report_zones")

Reviewed-by: Benjamin Marzinski <[email protected]>
> 
> ---
>  drivers/md/dm-zone.c |    9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> Index: linux-2.6/drivers/md/dm-zone.c
> ===================================================================
> --- linux-2.6.orig/drivers/md/dm-zone.c       2026-01-06 15:55:41.000000000 
> +0100
> +++ linux-2.6/drivers/md/dm-zone.c    2026-01-06 22:55:36.000000000 +0100
> @@ -60,11 +60,13 @@ int dm_blk_report_zones(struct gendisk *
>                * Zone revalidation during __bind() is in progress, but this
>                * call is from a different process
>                */
> -             if (dm_suspended_md(md))
> -                     return -EAGAIN;
> -
>               map = dm_get_live_table(md, &srcu_idx);
>               put_table = true;
> +
> +             if (dm_suspended_md(md)) {
> +                     ret = -EAGAIN;
> +                     goto do_put_table;
> +             }
>       } else {
>               /* Zone revalidation during __bind() */
>               map = zone_revalidate_map;
> @@ -79,6 +81,7 @@ int dm_blk_report_zones(struct gendisk *
>               ret = dm_blk_do_report_zones(md, map, nr_zones, &dm_args);
>       }
>  
> +do_put_table:
>       if (put_table)
>               dm_put_live_table(md, srcu_idx);
>  


Reply via email to