diff options
author | Aidan Dang <dang@aidan.gg> | 2022-09-25 16:12:10 +0200 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2022-10-07 16:36:04 +0200 |
commit | fd83c98e8a462b9b5ae07e3d7a2ace500b50c172 (patch) | |
tree | 364be92f922271f10ccef7745970559639814eda /src/shared/loop-util.c | |
parent | Merge pull request #22998 from DaanDeMeyer/journal-compact-split (diff) | |
download | systemd-fd83c98e8a462b9b5ae07e3d7a2ace500b50c172.tar.xz systemd-fd83c98e8a462b9b5ae07e3d7a2ace500b50c172.zip |
Implement --luks-sector-size for homed
Diffstat (limited to 'src/shared/loop-util.c')
-rw-r--r-- | src/shared/loop-util.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c index 84f4e79c07..731ce29112 100644 --- a/src/shared/loop-util.c +++ b/src/shared/loop-util.c @@ -123,6 +123,17 @@ static int loop_configure_verify(int fd, const struct loop_config *c) { assert(fd >= 0); assert(c); + if (c->block_size != 0) { + int z; + + if (ioctl(fd, BLKSSZGET, &z) < 0) + return -errno; + + assert(z >= 0); + if ((uint32_t) z != c->block_size) + log_debug("LOOP_CONFIGURE didn't honour requested block size %u, got %i instead. Ignoring.", c->block_size, z); + } + if (c->info.lo_sizelimit != 0) { /* Kernel 5.8 vanilla doesn't properly propagate the size limit into the * block device. If it's used, let's immediately check if it had the desired @@ -133,7 +144,7 @@ static int loop_configure_verify(int fd, const struct loop_config *c) { return -errno; if (z != c->info.lo_sizelimit) { - log_debug("LOOP_CONFIGURE is broken, doesn't honour .lo_sizelimit. Falling back to LOOP_SET_STATUS64."); + log_debug("LOOP_CONFIGURE is broken, doesn't honour .info.lo_sizelimit. Falling back to LOOP_SET_STATUS64."); broken = true; } } @@ -171,7 +182,7 @@ static int loop_configure_fallback(int fd, const struct loop_config *c) { info_copy.lo_flags &= LOOP_SET_STATUS_SETTABLE_FLAGS; /* Since kernel commit 5db470e229e22b7eda6e23b5566e532c96fb5bc3 (kernel v5.0) the LOOP_SET_STATUS64 - * ioctl can return EAGAIN in case we change the lo_offset field, if someone else is accessing the + * ioctl can return EAGAIN in case we change the info.lo_offset field, if someone else is accessing the * block device while we try to reconfigure it. This is a pretty common case, since udev might * instantly start probing the device as soon as we attach an fd to it. Hence handle it in two ways: * first, let's take the BSD lock to ensure that udev will not step in between the point in @@ -391,6 +402,7 @@ static int loop_device_make_internal( int open_flags, uint64_t offset, uint64_t size, + uint32_t block_size, uint32_t loop_flags, int lock_op, LoopDevice **ret) { @@ -463,6 +475,7 @@ static int loop_device_make_internal( config = (struct loop_config) { .fd = fd, + .block_size = block_size, .info = { /* Use the specified flags, but configure the read-only flag from the open flags, and force autoclear */ .lo_flags = (loop_flags & ~LO_FLAGS_READ_ONLY) | ((open_flags & O_ACCMODE) == O_RDONLY ? LO_FLAGS_READ_ONLY : 0) | LO_FLAGS_AUTOCLEAR, @@ -546,6 +559,7 @@ int loop_device_make( int open_flags, uint64_t offset, uint64_t size, + uint32_t block_size, uint32_t loop_flags, int lock_op, LoopDevice **ret) { @@ -559,6 +573,7 @@ int loop_device_make( open_flags, offset, size, + block_size, loop_flags_mangle(loop_flags), lock_op, ret); @@ -622,7 +637,7 @@ int loop_device_make_by_path( direct ? "enabled" : "disabled", direct != (direct_flags != 0) ? " (O_DIRECT was requested but not supported)" : ""); - return loop_device_make_internal(path, fd, open_flags, 0, 0, loop_flags, lock_op, ret); + return loop_device_make_internal(path, fd, open_flags, 0, 0, 0, loop_flags, lock_op, ret); } static LoopDevice* loop_device_free(LoopDevice *d) { |