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); >
