Revert "loop: cleanup partitions when detaching loop device"
Jens Axboe [Mon, 8 Apr 2013 08:12:11 +0000 (10:12 +0200)]
This reverts commit 8761a3dc1f07b163414e2215a2cadbb4cfe2a107.

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>

block/partition-generic.c
drivers/block/loop.c

index ae95ee6..789cdea 100644 (file)
@@ -257,7 +257,6 @@ void delete_partition(struct gendisk *disk, int partno)
 
        hd_struct_put(part);
 }
-EXPORT_SYMBOL(delete_partition);
 
 static ssize_t whole_disk_show(struct device *dev,
                               struct device_attribute *attr, char *buf)
index fe5f640..ee13a82 100644 (file)
@@ -1044,29 +1044,12 @@ 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