diff options
author | Christoph Hellwig <hch@lst.de> | 2020-07-16 16:33:07 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-07-16 17:35:44 +0200 |
commit | c5638ab417660e2c5d681aed5ce76df992982dbb (patch) | |
tree | a9b08a051c772e4f700544ed6bff6597add7af88 /fs/block_dev.c | |
parent | Revert "blk-rq-qos: remove redundant finish_wait to rq_qos_wait." (diff) | |
download | linux-c5638ab417660e2c5d681aed5ce76df992982dbb.tar.xz linux-c5638ab417660e2c5d681aed5ce76df992982dbb.zip |
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: Christoph Hellwig <hch@lst.de>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to '')
-rw-r--r-- | fs/block_dev.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index a36d5b6907ea..376832250c8e 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1517,7 +1517,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) int ret; int partno; int perm = 0; - bool first_open = false; + bool first_open = false, need_restart; if (mode & FMODE_READ) perm |= MAY_READ; @@ -1533,7 +1533,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) } restart: - + need_restart = false; ret = -ENXIO; disk = bdev_get_gendisk(bdev, &partno); if (!disk) @@ -1556,19 +1556,12 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) ret = 0; if (disk->fops->open) { ret = disk->fops->open(bdev, mode); - if (ret == -ERESTARTSYS) { - /* Lost a race with 'disk' being - * deleted, try again. - * See md.c - */ - disk_put_part(bdev->bd_part); - bdev->bd_part = NULL; - bdev->bd_disk = NULL; - mutex_unlock(&bdev->bd_mutex); - disk_unblock_events(disk); - put_disk_and_module(disk); - goto restart; - } + /* + * If we lost a race with 'disk' being deleted, + * try again. See md.c + */ + if (ret == -ERESTARTSYS) + need_restart = true; } 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); disk_unblock_events(disk); put_disk_and_module(disk); + if (need_restart) + goto restart; out: return ret; |