md: simplify md_open
authorChristoph Hellwig <hch@lst.de>
Tue, 19 Jul 2022 09:18:24 +0000 (11:18 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 2 Aug 2022 23:22:46 +0000 (17:22 -0600)
Now that devices are on the all_mddevs list until the gendisk is freed,
there can't be any duplicates.  Remove the global list lookup and just
grab a reference.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
Signed-off-by: Song Liu <song@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/md.c

index 2e9ed44..fa500ae 100644 (file)
@@ -7783,45 +7783,33 @@ out_unlock:
 
 static int md_open(struct block_device *bdev, fmode_t mode)
 {
-       /*
-        * Succeed if we can lock the mddev, which confirms that
-        * it isn't being stopped right now.
-        */
-       struct mddev *mddev = mddev_find(bdev->bd_dev);
+       struct mddev *mddev;
        int err;
 
+       spin_lock(&all_mddevs_lock);
+       mddev = mddev_get(bdev->bd_disk->private_data);
+       spin_unlock(&all_mddevs_lock);
        if (!mddev)
                return -ENODEV;
 
-       if (mddev->gendisk != bdev->bd_disk) {
-               /* we are racing with mddev_put which is discarding this
-                * bd_disk.
-                */
-               mddev_put(mddev);
-               /* Wait until bdev->bd_disk is definitely gone */
-               if (work_pending(&mddev->del_work))
-                       flush_workqueue(md_misc_wq);
-               return -EBUSY;
-       }
-       BUG_ON(mddev != bdev->bd_disk->private_data);
-
-       if ((err = mutex_lock_interruptible(&mddev->open_mutex)))
+       err = mutex_lock_interruptible(&mddev->open_mutex);
+       if (err)
                goto out;
 
-       if (test_bit(MD_CLOSING, &mddev->flags)) {
-               mutex_unlock(&mddev->open_mutex);
-               err = -ENODEV;
-               goto out;
-       }
+       err = -ENODEV;
+       if (test_bit(MD_CLOSING, &mddev->flags))
+               goto out_unlock;
 
-       err = 0;
        atomic_inc(&mddev->openers);
        mutex_unlock(&mddev->open_mutex);
 
        bdev_check_media_change(bdev);
- out:
-       if (err)
-               mddev_put(mddev);
+       return 0;
+
+out_unlock:
+       mutex_unlock(&mddev->open_mutex);
+out:
+       mddev_put(mddev);
        return err;
 }