]> www.infradead.org Git - users/hch/block.git/commitdiff
block: don't use disk->open_mutex for holder registration locking
authorChristoph Hellwig <hch@lst.de>
Wed, 19 Jan 2022 06:07:32 +0000 (07:07 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 19 Jan 2022 15:19:56 +0000 (16:19 +0100)
Use a separate lock for the older registration, which has nothing to
do with the open locking.

Signed-off-by: Christoph Hellwig <hch@lst.de>
block/genhd.c
block/holder.c
include/linux/genhd.h

index 626c8406f21a6a5b5def739ea87a8678e9732303..49a1c9378959f5e514cbe7df97566d965e0ea1b8 100644 (file)
@@ -1317,6 +1317,7 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
        lockdep_init_map(&disk->lockdep_map, "(bio completion)", lkclass, 0);
 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
        INIT_LIST_HEAD(&disk->slave_bdevs);
+       mutex_init(&disk->holder_mutex);
 #endif
        return disk;
 
index 27cddce1b44610033cdfbc73ccc0edb6d5a3b359..a920b0c1df8b8695c5f55ddaf6ac2667d166ce0d 100644 (file)
@@ -75,7 +75,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
        struct bd_holder_disk *holder;
        int ret = 0;
 
-       mutex_lock(&disk->open_mutex);
+       mutex_lock(&disk->holder_mutex);
 
        WARN_ON_ONCE(!bdev->bd_holder);
 
@@ -114,7 +114,7 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
        kobject_get(bdev->bd_holder_dir);
 
 out_unlock:
-       mutex_unlock(&disk->open_mutex);
+       mutex_unlock(&disk->holder_mutex);
        return ret;
 }
 EXPORT_SYMBOL_GPL(bd_link_disk_holder);
@@ -140,7 +140,7 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
 {
        struct bd_holder_disk *holder;
 
-       mutex_lock(&disk->open_mutex);
+       mutex_lock(&disk->holder_mutex);
        holder = bd_find_holder_disk(bdev, disk);
        if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
                if (disk->slave_dir)
@@ -149,7 +149,7 @@ void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
                list_del_init(&holder->list);
                kfree(holder);
        }
-       mutex_unlock(&disk->open_mutex);
+       mutex_unlock(&disk->holder_mutex);
 }
 EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
 
@@ -158,18 +158,18 @@ int bd_register_pending_holders(struct gendisk *disk)
        struct bd_holder_disk *holder;
        int ret;
 
-       mutex_lock(&disk->open_mutex);
+       mutex_lock(&disk->holder_mutex);
        list_for_each_entry(holder, &disk->slave_bdevs, list) {
                ret = __link_disk_holder(holder->bdev, disk);
                if (ret)
                        goto out_undo;
        }
-       mutex_unlock(&disk->open_mutex);
+       mutex_unlock(&disk->holder_mutex);
        return 0;
 
 out_undo:
        list_for_each_entry_continue_reverse(holder, &disk->slave_bdevs, list)
                __unlink_disk_holder(holder->bdev, disk);
-       mutex_unlock(&disk->open_mutex);
+       mutex_unlock(&disk->holder_mutex);
        return ret;
 }
index 6906a45bc761a49befa3bfb5ccea559dcd253dda..d810188e5d6be2176a660be00333e5c3de4fe542 100644 (file)
@@ -118,6 +118,7 @@ struct gendisk {
        struct kobject *slave_dir;
 #ifdef CONFIG_BLOCK_HOLDER_DEPRECATED
        struct list_head slave_bdevs;
+       struct mutex holder_mutex;
 #endif
        struct timer_rand_state *random;
        atomic_t sync_io;               /* RAID */