|
@@ -1044,12 +1044,29 @@ static int loop_clr_fd(struct loop_device *lo)
|
|
|
lo->lo_state = Lo_unbound;
|
|
|
/* This is safe: open() is still holding a reference. */
|
|
|
module_put(THIS_MODULE);
|
|
|
- if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev)
|
|
|
- ioctl_by_bdev(bdev, BLKRRPART, 0);
|
|
|
lo->lo_flags = 0;
|
|
|
if (!part_shift)
|
|
|
lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
|
|
|
mutex_unlock(&lo->lo_ctl_mutex);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Remove all partitions, since BLKRRPART won't remove user
|
|
|
+ * added partitions when max_part=0
|
|
|
+ */
|
|
|
+ if (bdev) {
|
|
|
+ struct disk_part_iter piter;
|
|
|
+ struct hd_struct *part;
|
|
|
+
|
|
|
+ mutex_lock_nested(&bdev->bd_mutex, 1);
|
|
|
+ invalidate_partition(bdev->bd_disk, 0);
|
|
|
+ disk_part_iter_init(&piter, bdev->bd_disk,
|
|
|
+ DISK_PITER_INCL_EMPTY);
|
|
|
+ while ((part = disk_part_iter_next(&piter)))
|
|
|
+ delete_partition(bdev->bd_disk, part->partno);
|
|
|
+ disk_part_iter_exit(&piter);
|
|
|
+ mutex_unlock(&bdev->bd_mutex);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Need not hold lo_ctl_mutex to fput backing file.
|
|
|
* Calling fput holding lo_ctl_mutex triggers a circular
|