loop: Set correct device size when using LOOP_CONFIGURE
authorMartijn Coenen <maco@android.com>
Tue, 25 Aug 2020 07:18:29 +0000 (09:18 +0200)
committerJens Axboe <axboe@kernel.dk>
Wed, 26 Aug 2020 15:30:31 +0000 (09:30 -0600)
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: 3448914e8cc5("loop: Add LOOP_CONFIGURE ioctl")
Reported-by: Lennart Poettering <mzxreary@0pointer.de>
Tested-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
Signed-off-by: Martijn Coenen <maco@android.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c

index 3d7a190..03ce01c 100644 (file)
@@ -1114,8 +1114,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
        mapping = file->f_mapping;
        inode = mapping->host;
 
-       size = get_loop_size(lo, file);
-
        if ((config->info.lo_flags & ~LOOP_CONFIGURE_SETTABLE_FLAGS) != 0) {
                error = -EINVAL;
                goto out_unlock;
@@ -1165,6 +1163,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
        loop_update_rotational(lo);
        loop_update_dio(lo);
        loop_sysfs_init(lo);
+
+       size = get_loop_size(lo, file);
        loop_set_size(lo, size);
 
        set_blocksize(bdev, S_ISBLK(inode->i_mode) ?