summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2026-01-08 22:55:08 +0300
committerMikulas Patocka <mpatocka@redhat.com>2026-01-14 15:12:02 +0300
commit24c405fdbe215c45e57bba672cc42859038491ee (patch)
treeaa801d049cb23f696ea6aec85bbaa410d755d055
parent8fbb8fe75d4cf92eaa7b21828ec39c1bf79a262f (diff)
downloadlinux-24c405fdbe215c45e57bba672cc42859038491ee.tar.xz
dm: fix unlocked test for dm_suspended_md
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 <mpatocka@redhat.com> Fixes: 37f53a2c60d0 ("dm: fix dm_blk_report_zones") Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
-rw-r--r--drivers/md/dm-zone.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/md/dm-zone.c b/drivers/md/dm-zone.c
index c95e417194b3..bc4e45862a22 100644
--- a/drivers/md/dm-zone.c
+++ b/drivers/md/dm-zone.c
@@ -60,11 +60,13 @@ int dm_blk_report_zones(struct gendisk *disk, sector_t sector,
* 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 *disk, sector_t sector,
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);