diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c index bf4d73fa998ccda02eca5d8fb3dcc92470d94598..3a89f8daee0f127d10b7d612e13bba6a6bd3bb50 100644 --- a/drivers/nvme/host/multipath.c +++ b/drivers/nvme/host/multipath.c @@ -311,15 +311,13 @@ static void nvme_mpath_set_live(struct nvme_ns *ns) if (!head->disk) return; - mutex_lock(&head->lock); - if (!(head->disk->flags & GENHD_FL_UP)) { + if (!test_and_set_bit(NVME_NSHEAD_DISK_LIVE, &head->flags)) { device_add_disk(&head->subsys->dev, head->disk); if (sysfs_create_group(&disk_to_dev(head->disk)->kobj, &nvme_ns_id_attr_group)) dev_warn(&head->subsys->dev, "failed to create id group.\n"); } - mutex_unlock(&head->lock); synchronize_srcu(&head->srcu); kblockd_schedule_work(&head->requeue_work); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 460136e45b16005a545a4858103b5b7da0afd22c..46e570017fd04d168c8832875f2eff847eace7fa 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -289,6 +289,8 @@ struct nvme_ns_head { spinlock_t requeue_lock; struct work_struct requeue_work; struct mutex lock; + unsigned long flags; +#define NVME_NSHEAD_DISK_LIVE 0 #endif struct list_head list; struct srcu_struct srcu;