Commit 79e5dc59 authored by Martijn Coenen's avatar Martijn Coenen Committed by Jens Axboe

loop: Set correct device size when using LOOP_CONFIGURE

The device size calculation was done before processing the loop
configuration, which meant that the we set the size on the underlying
block device incorrectly in case lo_offset/lo_sizelimit were set in the
configuration. Delay computing the size until we've setup the device
parameters correctly.

Fixes: 3448914e("loop: Add LOOP_CONFIGURE ioctl")
Reported-by: default avatarLennart Poettering <mzxreary@0pointer.de>
Tested-by: default avatarYang Xu <xuyang2018.jy@cn.fujitsu.com>
Signed-off-by: default avatarMartijn Coenen <maco@android.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent acb19e17
...@@ -1114,8 +1114,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, ...@@ -1114,8 +1114,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
mapping = file->f_mapping; mapping = file->f_mapping;
inode = mapping->host; inode = mapping->host;
size = get_loop_size(lo, file);
if ((config->info.lo_flags & ~LOOP_CONFIGURE_SETTABLE_FLAGS) != 0) { if ((config->info.lo_flags & ~LOOP_CONFIGURE_SETTABLE_FLAGS) != 0) {
error = -EINVAL; error = -EINVAL;
goto out_unlock; goto out_unlock;
...@@ -1165,6 +1163,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode, ...@@ -1165,6 +1163,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
loop_update_rotational(lo); loop_update_rotational(lo);
loop_update_dio(lo); loop_update_dio(lo);
loop_sysfs_init(lo); loop_sysfs_init(lo);
size = get_loop_size(lo, file);
loop_set_size(lo, size); loop_set_size(lo, size);
set_blocksize(bdev, S_ISBLK(inode->i_mode) ? set_blocksize(bdev, S_ISBLK(inode->i_mode) ?
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment