dm ioctl: assert _hash_lock is held in __hash_remove
authorMike Snitzer <snitzer@kernel.org>
Fri, 17 Feb 2023 18:08:17 +0000 (13:08 -0500)
committerMike Snitzer <snitzer@kernel.org>
Fri, 17 Feb 2023 19:49:21 +0000 (14:49 -0500)
Also update dm_early_create() to take _hash_lock when calling both
__get_name_cell and __hash_remove -- given dm_early_create()'s early
boot usecase this locking isn't about correctness but it allows
lockdep_assert_held() to be added to __hash_remove.

Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-ioctl.c

index f34d36a..067dfc0 100644 (file)
@@ -310,6 +310,8 @@ static struct dm_table *__hash_remove(struct hash_cell *hc)
        struct dm_table *table;
        int srcu_idx;
 
+       lockdep_assert_held(&_hash_lock);
+
        /* remove from the dev trees */
        __unlink_name(hc);
        __unlink_uuid(hc);
@@ -2263,7 +2265,9 @@ int __init dm_early_create(struct dm_ioctl *dmi,
 err_destroy_table:
        dm_table_destroy(t);
 err_hash_remove:
+       down_write(&_hash_lock);
        (void) __hash_remove(__get_name_cell(dmi->name));
+       up_write(&_hash_lock);
        /* release reference from __get_name_cell */
        dm_put(md);
 err_destroy_dm: