Commit c5638ab4 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: simplify the restart case in __blkdev_get



Insted of duplicating all the cleanup logic jump to the code that cleans
up anyway, and restart after that.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent e791ee68
Loading
Loading
Loading
Loading
+10 −15
Original line number Original line Diff line number Diff line
@@ -1517,7 +1517,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
	int ret;
	int ret;
	int partno;
	int partno;
	int perm = 0;
	int perm = 0;
	bool first_open = false;
	bool first_open = false, need_restart;


	if (mode & FMODE_READ)
	if (mode & FMODE_READ)
		perm |= MAY_READ;
		perm |= MAY_READ;
@@ -1533,7 +1533,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
	}
	}


 restart:
 restart:

	need_restart = false;
	ret = -ENXIO;
	ret = -ENXIO;
	disk = bdev_get_gendisk(bdev, &partno);
	disk = bdev_get_gendisk(bdev, &partno);
	if (!disk)
	if (!disk)
@@ -1556,19 +1556,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
			ret = 0;
			ret = 0;
			if (disk->fops->open) {
			if (disk->fops->open) {
				ret = disk->fops->open(bdev, mode);
				ret = disk->fops->open(bdev, mode);
				if (ret == -ERESTARTSYS) {
				/*
					/* Lost a race with 'disk' being
				 * If we lost a race with 'disk' being deleted,
					 * deleted, try again.
				 * try again.  See md.c
					 * See md.c
				 */
				 */
					disk_put_part(bdev->bd_part);
				if (ret == -ERESTARTSYS)
					bdev->bd_part = NULL;
					need_restart = true;
					bdev->bd_disk = NULL;
					mutex_unlock(&bdev->bd_mutex);
					disk_unblock_events(disk);
					put_disk_and_module(disk);
					goto restart;
				}
			}
			}


			if (!ret) {
			if (!ret) {
@@ -1647,6 +1640,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
	mutex_unlock(&bdev->bd_mutex);
	mutex_unlock(&bdev->bd_mutex);
	disk_unblock_events(disk);
	disk_unblock_events(disk);
	put_disk_and_module(disk);
	put_disk_and_module(disk);
	if (need_restart)
		goto restart;
 out:
 out:


	return ret;
	return ret;