diff options
author | Manuel Bentele | 2020-12-02 07:07:44 +0100 |
---|---|---|
committer | Manuel Bentele | 2020-12-02 07:07:44 +0100 |
commit | cbdb5025a3127d20a1e18a14bbcb0cc17be84710 (patch) | |
tree | 6df46d1e538691cee1b34fba55d6466253d198e2 /src/kernel/xloop_main.c | |
parent | Add Linux kernel module support for 32-bit architectures (eg. ARM) (diff) | |
download | xloop-cbdb5025a3127d20a1e18a14bbcb0cc17be84710.tar.gz xloop-cbdb5025a3127d20a1e18a14bbcb0cc17be84710.tar.xz xloop-cbdb5025a3127d20a1e18a14bbcb0cc17be84710.zip |
Setup xloop device with XLOOP_CONFIGURE ioctl call
This feature allows the userspace tool xlosetup to completely setup a
loop device with a single ioctl call, removing the in-between state
where the device can be partially configured, eg. the loop device has
a backing file associated with it, but is reading from the wrong offset.
Besides removing the intermediate state, another big benefit of this
ioctl is that XLOOP_SET_STATUS can be slow. The main reason for this
slowness is that XLOOP_SET_STATUS(64) calls blk_mq_freeze_queue() to
freeze the associated queue. This requires waiting for RCU.
Diffstat (limited to 'src/kernel/xloop_main.c')
-rw-r--r-- | src/kernel/xloop_main.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/kernel/xloop_main.c b/src/kernel/xloop_main.c index de1fc3d..441282a 100644 --- a/src/kernel/xloop_main.c +++ b/src/kernel/xloop_main.c @@ -877,11 +877,6 @@ static int xloop_configure(struct xloop_device *xlo, fmode_t mode, if (error) goto out_unlock; - error = xloop_file_fmt_init(xlo->xlo_fmt, - config->info.xlo_file_fmt_type); - if (error) - goto out_unlock; - set_device_ro(bdev, (xlo->xlo_flags & XLO_FLAGS_READ_ONLY) != 0); xlo->use_dio = xlo->xlo_flags & XLO_FLAGS_DIRECT_IO; @@ -890,6 +885,11 @@ static int xloop_configure(struct xloop_device *xlo, fmode_t mode, xlo->old_gfp_mask = mapping_gfp_mask(mapping); mapping_set_gfp_mask(mapping, xlo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); + error = xloop_file_fmt_init(xlo->xlo_fmt, + config->info.xlo_file_fmt_type); + if (error) + goto out_unlock; + if (!(xlo->xlo_flags & XLO_FLAGS_READ_ONLY) && file->f_op->fsync) blk_queue_write_cache(xlo->xlo_queue, true, false); |