mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-05 23:45:05 -05:00
md: simplify md_open
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>
This commit is contained in:
committed by
Jens Axboe
parent
12a6caf273
commit
5b26804bb0
@@ -7783,45 +7783,33 @@ static int md_set_read_only(struct block_device *bdev, bool ro)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user