mirror of
https://github.com/torvalds/linux.git
synced 2026-03-14 00:56:20 +01:00
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: 37f53a2c60 ("dm: fix dm_blk_report_zones")
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
This commit is contained in:
parent
8fbb8fe75d
commit
24c405fdbe
1 changed files with 6 additions and 3 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue