]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/block/loop.c
loopdev: update block device size in loop_set_status()
[mirror_ubuntu-bionic-kernel.git] / drivers / block / loop.c
index ae125127062487f0bdbdb2f2463dce6047a2bb04..ed850366f22d8eae8260b8851ae212a7115b87bb 100644 (file)
@@ -1092,8 +1092,13 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
 
        if (lo->lo_offset != info->lo_offset ||
            lo->lo_sizelimit != info->lo_sizelimit) {
+               struct block_device *bdev = lo->lo_device;
+
                if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit))
                        return -EFBIG;
+
+               bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9);
+               kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
        }
        loop_config_discard(lo);
 
@@ -1285,11 +1290,9 @@ static int loop_set_capacity(struct loop_device *lo, struct block_device *bdev)
        /* the width of sector_t may be narrow for bit-shift */
        sz = sec;
        sz <<= 9;
-       mutex_lock(&bdev->bd_mutex);
        bd_set_size(bdev, sz);
        /* let user-space know about the new size */
        kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
-       mutex_unlock(&bdev->bd_mutex);
 
  out:
        return err;