diff options
Diffstat (limited to 'drivers/block/loop.c')
| -rw-r--r-- | drivers/block/loop.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 747bb2af69dc..dfe758382eaf 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
| @@ -922,6 +922,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | |||
| 922 | lo->lo_flags |= LO_FLAGS_PARTSCAN; | 922 | lo->lo_flags |= LO_FLAGS_PARTSCAN; |
| 923 | if (lo->lo_flags & LO_FLAGS_PARTSCAN) | 923 | if (lo->lo_flags & LO_FLAGS_PARTSCAN) |
| 924 | ioctl_by_bdev(bdev, BLKRRPART, 0); | 924 | ioctl_by_bdev(bdev, BLKRRPART, 0); |
| 925 | |||
| 926 | /* Grab the block_device to prevent its destruction after we | ||
| 927 | * put /dev/loopXX inode. Later in loop_clr_fd() we bdput(bdev). | ||
| 928 | */ | ||
| 929 | bdgrab(bdev); | ||
| 925 | return 0; | 930 | return 0; |
| 926 | 931 | ||
| 927 | out_clr: | 932 | out_clr: |
| @@ -1031,8 +1036,10 @@ static int loop_clr_fd(struct loop_device *lo) | |||
| 1031 | memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); | 1036 | memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); |
| 1032 | memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); | 1037 | memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); |
| 1033 | memset(lo->lo_file_name, 0, LO_NAME_SIZE); | 1038 | memset(lo->lo_file_name, 0, LO_NAME_SIZE); |
| 1034 | if (bdev) | 1039 | if (bdev) { |
| 1040 | bdput(bdev); | ||
| 1035 | invalidate_bdev(bdev); | 1041 | invalidate_bdev(bdev); |
| 1042 | } | ||
| 1036 | set_capacity(lo->lo_disk, 0); | 1043 | set_capacity(lo->lo_disk, 0); |
| 1037 | loop_sysfs_exit(lo); | 1044 | loop_sysfs_exit(lo); |
| 1038 | if (bdev) { | 1045 | if (bdev) { |
| @@ -1623,6 +1630,7 @@ static int loop_add(struct loop_device **l, int i) | |||
| 1623 | goto out_free_dev; | 1630 | goto out_free_dev; |
| 1624 | i = err; | 1631 | i = err; |
| 1625 | 1632 | ||
| 1633 | err = -ENOMEM; | ||
| 1626 | lo->lo_queue = blk_alloc_queue(GFP_KERNEL); | 1634 | lo->lo_queue = blk_alloc_queue(GFP_KERNEL); |
| 1627 | if (!lo->lo_queue) | 1635 | if (!lo->lo_queue) |
| 1628 | goto out_free_dev; | 1636 | goto out_free_dev; |
