|
@@ -190,6 +190,7 @@ figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit)
|
|
|
{
|
|
|
loff_t size = get_size(offset, sizelimit, lo->lo_backing_file);
|
|
|
sector_t x = (sector_t)size;
|
|
|
+ struct block_device *bdev = lo->lo_device;
|
|
|
|
|
|
if (unlikely((loff_t)x != size))
|
|
|
return -EFBIG;
|
|
@@ -198,6 +199,9 @@ figure_loop_size(struct loop_device *lo, loff_t offset, loff_t sizelimit)
|
|
|
if (lo->lo_sizelimit != sizelimit)
|
|
|
lo->lo_sizelimit = sizelimit;
|
|
|
set_capacity(lo->lo_disk, x);
|
|
|
+ bd_set_size(bdev, (loff_t)get_capacity(bdev->bd_disk) << 9);
|
|
|
+ /* let user-space know about the new size */
|
|
|
+ kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1091,15 +1095,10 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
|
|
|
return err;
|
|
|
|
|
|
if (lo->lo_offset != info->lo_offset ||
|
|
|
- lo->lo_sizelimit != info->lo_sizelimit) {
|
|
|
- struct block_device *bdev = lo->lo_device;
|
|
|
-
|
|
|
+ lo->lo_sizelimit != info->lo_sizelimit)
|
|
|
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);
|
|
|
|
|
|
memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE);
|
|
@@ -1276,26 +1275,10 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) {
|
|
|
|
|
|
static int loop_set_capacity(struct loop_device *lo, struct block_device *bdev)
|
|
|
{
|
|
|
- int err;
|
|
|
- sector_t sec;
|
|
|
- loff_t sz;
|
|
|
-
|
|
|
- err = -ENXIO;
|
|
|
if (unlikely(lo->lo_state != Lo_bound))
|
|
|
- goto out;
|
|
|
- err = figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit);
|
|
|
- if (unlikely(err))
|
|
|
- goto out;
|
|
|
- sec = get_capacity(lo->lo_disk);
|
|
|
- /* the width of sector_t may be narrow for bit-shift */
|
|
|
- sz = sec;
|
|
|
- sz <<= 9;
|
|
|
- bd_set_size(bdev, sz);
|
|
|
- /* let user-space know about the new size */
|
|
|
- kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
|
|
|
+ return -ENXIO;
|
|
|
|
|
|
- out:
|
|
|
- return err;
|
|
|
+ return figure_loop_size(lo, lo->lo_offset, lo->lo_sizelimit);
|
|
|
}
|
|
|
|
|
|
static int lo_ioctl(struct block_device *bdev, fmode_t mode,
|