diff options
| author | Mikulas Patocka <mpatocka@redhat.com> | 2026-01-08 22:55:08 +0300 |
|---|---|---|
| committer | Mikulas Patocka <mpatocka@redhat.com> | 2026-01-14 15:12:02 +0300 |
| commit | 24c405fdbe215c45e57bba672cc42859038491ee (patch) | |
| tree | aa801d049cb23f696ea6aec85bbaa410d755d055 | |
| parent | 8fbb8fe75d4cf92eaa7b21828ec39c1bf79a262f (diff) | |
| download | linux-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.c | 9 |
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); |
