From 017c27fc83b1eaa7570802b06864131033cd5e9d Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 19 Jan 2022 07:07:32 +0100 Subject: [PATCH] block: don't use disk->open_mutex for holder registration locking Use a separate lock for the older registration, which has nothing to do with the open locking. Signed-off-by: Christoph Hellwig --- block/genhd.c | 1 + block/holder.c | 14 +++++++------- include/linux/genhd.h | 1 + 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 626c8406f21a..49a1c9378959 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -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; diff --git a/block/holder.c b/block/holder.c index 27cddce1b446..a920b0c1df8b 100644 --- a/block/holder.c +++ b/block/holder.c @@ -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; } diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 6906a45bc761..d810188e5d6b 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -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 */ -- 2.50.1