Revert "loop: cleanup partitions when detaching loop device"
This reverts commit 8761a3dc1f
.
There are situations where the destruction path is called
with the bdev->bd_mutex already held, which then deadlocks in
loop_clr_fd(). The normal partition cleanup does a trylock()
on the mutex, but it'd be nice to have a more bullet proof
method in loop. So punt this more involved fix to the next
merge window, and just back out this buggy fix for now.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
c66bb3f075
commit
c2fccc1c9f
|
@ -257,7 +257,6 @@ void delete_partition(struct gendisk *disk, int partno)
|
||||||
|
|
||||||
hd_struct_put(part);
|
hd_struct_put(part);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(delete_partition);
|
|
||||||
|
|
||||||
static ssize_t whole_disk_show(struct device *dev,
|
static ssize_t whole_disk_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
|
|
|
@ -1044,29 +1044,12 @@ static int loop_clr_fd(struct loop_device *lo)
|
||||||
lo->lo_state = Lo_unbound;
|
lo->lo_state = Lo_unbound;
|
||||||
/* This is safe: open() is still holding a reference. */
|
/* This is safe: open() is still holding a reference. */
|
||||||
module_put(THIS_MODULE);
|
module_put(THIS_MODULE);
|
||||||
|
if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev)
|
||||||
|
ioctl_by_bdev(bdev, BLKRRPART, 0);
|
||||||
lo->lo_flags = 0;
|
lo->lo_flags = 0;
|
||||||
if (!part_shift)
|
if (!part_shift)
|
||||||
lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
|
lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
|
||||||
mutex_unlock(&lo->lo_ctl_mutex);
|
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.
|
* Need not hold lo_ctl_mutex to fput backing file.
|
||||||
* Calling fput holding lo_ctl_mutex triggers a circular
|
* Calling fput holding lo_ctl_mutex triggers a circular
|
||||||
|
|
Loading…
Reference in New Issue