@@ -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;
}
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@redhat.com> --- drivers/block/loop.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-)