Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2fccc1c authored by Jens Axboe's avatar Jens Axboe
Browse files

Revert "loop: cleanup partitions when detaching loop device"



This reverts commit 8761a3dc.

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: default avatarJens Axboe <axboe@kernel.dk>
parent c66bb3f0
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -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)
+2 −19
Original line number Original line Diff line number Diff line
@@ -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