|
@@ -922,6 +922,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
|
|
|
lo->lo_flags |= LO_FLAGS_PARTSCAN;
|
|
|
if (lo->lo_flags & LO_FLAGS_PARTSCAN)
|
|
|
ioctl_by_bdev(bdev, BLKRRPART, 0);
|
|
|
+
|
|
|
+ /* Grab the block_device to prevent its destruction after we
|
|
|
+ * put /dev/loopXX inode. Later in loop_clr_fd() we bdput(bdev).
|
|
|
+ */
|
|
|
+ bdgrab(bdev);
|
|
|
return 0;
|
|
|
|
|
|
out_clr:
|
|
@@ -1031,8 +1036,10 @@ static int loop_clr_fd(struct loop_device *lo)
|
|
|
memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
|
|
|
memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
|
|
|
memset(lo->lo_file_name, 0, LO_NAME_SIZE);
|
|
|
- if (bdev)
|
|
|
+ if (bdev) {
|
|
|
+ bdput(bdev);
|
|
|
invalidate_bdev(bdev);
|
|
|
+ }
|
|
|
set_capacity(lo->lo_disk, 0);
|
|
|
loop_sysfs_exit(lo);
|
|
|
if (bdev) {
|