loop_reread_partitions() has been there for rereading partitions, so replace the open code in __loop_clr_fd() with loop_reread_partitions() by passing 'locked' parameter. Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> --- drivers/block/loop.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index a943207705dd..0e08468b9ce0 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -650,13 +650,17 @@ static inline void loop_update_dio(struct loop_device *lo) } static void loop_reread_partitions(struct loop_device *lo, - struct block_device *bdev) + struct block_device *bdev, bool locked) { int rc; - mutex_lock(&bdev->bd_mutex); - rc = bdev_disk_changed(bdev, false); - mutex_unlock(&bdev->bd_mutex); + if (locked) { + rc = bdev_disk_changed(bdev, false); + } else { + mutex_lock(&bdev->bd_mutex); + rc = bdev_disk_changed(bdev, false); + mutex_unlock(&bdev->bd_mutex); + } if (rc) pr_warn("%s: partition scan of loop%d (%s) failed (rc=%d)\n", __func__, lo->lo_number, lo->lo_file_name, rc); @@ -754,7 +758,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, */ fput(old_file); if (partscan) - loop_reread_partitions(lo, bdev); + loop_reread_partitions(lo, bdev, false); return 0; out_err: @@ -1179,7 +1183,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, bdgrab(bdev); mutex_unlock(&loop_ctl_mutex); if (partscan) - loop_reread_partitions(lo, bdev); + loop_reread_partitions(lo, bdev, false); if (claimed_bdev) bd_abort_claiming(bdev, claimed_bdev, loop_configure); return 0; @@ -1270,16 +1274,7 @@ static int __loop_clr_fd(struct loop_device *lo, bool release) * must be at least one and it can only become zero when the * current holder is released. */ - if (!release) - mutex_lock(&bdev->bd_mutex); - err = bdev_disk_changed(bdev, false); - if (!release) - mutex_unlock(&bdev->bd_mutex); - if (err) - pr_warn("%s: partition scan of loop%d failed (rc=%d)\n", - __func__, lo_number, err); - /* Device is gone, no point in returning error */ - err = 0; + loop_reread_partitions(lo, bdev, release); } /* @@ -1420,7 +1415,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info) out_unlock: mutex_unlock(&loop_ctl_mutex); if (partscan) - loop_reread_partitions(lo, bdev); + loop_reread_partitions(lo, bdev, false); return err; } -- 2.25.2