diff options
author | Lennart Poettering <lennart@poettering.net> | 2023-01-17 18:50:59 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2023-01-18 10:47:17 +0100 |
commit | 22ee78a8987f29e7f837efab86ed090ab78c1170 (patch) | |
tree | c2de760025b5f30bc7b27ecd48bfa423d1e3960d /src/shared/dissect-image.c | |
parent | 05c4c59ff127668ddaa85f0a9fd67cee3c41ce00 (diff) | |
download | systemd-22ee78a8987f29e7f837efab86ed090ab78c1170.tar.gz |
loop-util: always tell kernel explicitly about loopback sector size
Let's not leave the sector size unspecified: either set a user supplied
value, or auto-detect the right size by probing the disk image
accordingly.
Diffstat (limited to 'src/shared/dissect-image.c')
-rw-r--r-- | src/shared/dissect-image.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index d78568d344..da8eba83de 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -546,6 +546,7 @@ static int dissect_image( assert(!verity || verity->root_hash_sig || verity->root_hash_sig_size == 0); assert(!verity || (verity->root_hash || !verity->root_hash_sig)); assert(!((flags & DISSECT_IMAGE_GPT_ONLY) && (flags & DISSECT_IMAGE_NO_PARTITION_TABLE))); + assert(m->sector_size > 0); /* Probes a disk image, and returns information about what it found in *ret. * @@ -594,6 +595,11 @@ static int dissect_image( if (r != 0) return errno_or_else(ENOMEM); + errno = 0; + r = blkid_probe_set_sectorsize(b, m->sector_size); + if (r != 0) + return errno_or_else(EIO); + if ((flags & DISSECT_IMAGE_GPT_ONLY) == 0) { /* Look for file system superblocks, unless we only shall look for GPT partition tables */ blkid_probe_enable_superblocks(b, 1); @@ -1326,6 +1332,10 @@ int dissect_image_file( if (r < 0) return r; + r = probe_sector_size(fd, &m->sector_size); + if (r < 0) + return r; + r = dissect_image(m, fd, path, verity, mount_options, flags); if (r < 0) return r; @@ -3143,6 +3153,7 @@ int dissect_loop_device( return r; m->loop = loop_device_ref(loop); + m->sector_size = m->loop->sector_size; r = dissect_image(m, loop->fd, loop->node, verity, mount_options, flags); if (r < 0) @@ -3318,6 +3329,7 @@ int mount_image_privately_interactively( r = loop_device_make_by_path( image, FLAGS_SET(flags, DISSECT_IMAGE_DEVICE_READ_ONLY) ? O_RDONLY : O_RDWR, + /* sector_size= */ UINT32_MAX, FLAGS_SET(flags, DISSECT_IMAGE_NO_PARTITION_TABLE) ? 0 : LO_FLAGS_PARTSCAN, LOCK_SH, &d); @@ -3409,7 +3421,8 @@ int verity_dissect_and_mount( * accepted by LOOP_CONFIGURE, so just let loop_device_make_by_path reopen it as a regular FD. */ r = loop_device_make_by_path( src_fd >= 0 ? FORMAT_PROC_FD_PATH(src_fd) : src, - -1, + /* open_flags= */ -1, + /* sector_size= */ UINT32_MAX, verity.data_path ? 0 : LO_FLAGS_PARTSCAN, LOCK_SH, &loop_device); |