Implement --luks-sector-size for homed
This commit is contained in:
committed by
Luca Boccassi
parent
b25e08a752
commit
fd83c98e8a
+18
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user