aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/loop.c
diff options
context:
space:
mode:
authorPhillip Susi <psusi@ubuntu.com>2013-03-22 14:21:53 -0400
committerJens Axboe <axboe@kernel.dk>2013-03-22 14:21:53 -0400
commit8761a3dc1f07b163414e2215a2cadbb4cfe2a107 (patch)
treeebe3db5af9e706a3d3c5aaf4ba2b74459b02572b /drivers/block/loop.c
parent183cfb5720dfc393641b87710ce78561af3db6cd (diff)
loop: cleanup partitions when detaching loop device
Any partitions added by user space to the loop device were being left in place after detaching the loop device. This was because the detach path issued a BLKRRPART to clean up partitions if LO_FLAGS_PARTSCAN was set, meaning that the partitions were auto scanned on attach. Replace this BLKRRPART with code that unconditionally cleans up partitions on detach instead. Signed-off-by: Phillip Susi <psusi@ubuntu.com> Modified by Jens to export delete_partition(). Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r--drivers/block/loop.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index ee13a82f3f5e..fe5f6403417f 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1044,12 +1044,29 @@ static int loop_clr_fd(struct loop_device *lo)
1044 lo->lo_state = Lo_unbound; 1044 lo->lo_state = Lo_unbound;
1045 /* This is safe: open() is still holding a reference. */ 1045 /* This is safe: open() is still holding a reference. */
1046 module_put(THIS_MODULE); 1046 module_put(THIS_MODULE);
1047 if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev)
1048 ioctl_by_bdev(bdev, BLKRRPART, 0);
1049 lo->lo_flags = 0; 1047 lo->lo_flags = 0;
1050 if (!part_shift) 1048 if (!part_shift)
1051 lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; 1049 lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
1052 mutex_unlock(&lo->lo_ctl_mutex); 1050 mutex_unlock(&lo->lo_ctl_mutex);
1051
1052 /*
1053 * Remove all partitions, since BLKRRPART won't remove user
1054 * added partitions when max_part=0
1055 */
1056 if (bdev) {
1057 struct disk_part_iter piter;
1058 struct hd_struct *part;
1059
1060 mutex_lock_nested(&bdev->bd_mutex, 1);
1061 invalidate_partition(bdev->bd_disk, 0);
1062 disk_part_iter_init(&piter, bdev->bd_disk,
1063 DISK_PITER_INCL_EMPTY);
1064 while ((part = disk_part_iter_next(&piter)))
1065 delete_partition(bdev->bd_disk, part->partno);
1066 disk_part_iter_exit(&piter);
1067 mutex_unlock(&bdev->bd_mutex);
1068 }
1069
1053 /* 1070 /*
1054 * Need not hold lo_ctl_mutex to fput backing file. 1071 * Need not hold lo_ctl_mutex to fput backing file.
1055 * Calling fput holding lo_ctl_mutex triggers a circular 1072 * Calling fput holding lo_ctl_mutex triggers a circular