]> git.ipfire.org Git - thirdparty/systemd.git/commit
loop-util: don't reuse partition fd when partscan needed main
authorClayton Craft <clayton@craftyguy.net>
Tue, 28 Apr 2026 02:38:26 +0000 (19:38 -0700)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 28 Apr 2026 14:25:07 +0000 (15:25 +0100)
commit47d408163b0b71e5f8fed6b2e520c053cefc5780
treeb858c083c2ffd827f829a8b75b02dd16b4f6ae0a
parentd0f726ed8f9f62c0fef14723aab241ff7b23e9ef
loop-util: don't reuse partition fd when partscan needed

Some devices (e.g. android phones running pmOS) cannot have their OEM
partition table altered without breaking the firmware, so the distros's
partitions live inside a nested GPT carved into one of the OEM
partitions. Exposing these subpartitions requires wrapping the outer
partition in a loop device with partscan enabled, since the kernel does
not go into nested partition tables.

systemd already detects this case in udev-builtin-blkid
(ID_PART_GPT_AUTO_ROOT_DISK_NEEDS_LOOP) and acts on with
systemd-loop@.service, but this fails towards the end.
loop_device_make_internal has an optimization where if the input is
already a block device with a matching sector size, it skips creating
a loop and just hands back the original fd. That's fine for whole disks
but wrong for partitions, which don't support partscan, so this causes
dissect_image to fail with EPROTONOSUPPORT.

This patch changes the behavior to only take the shortcut when the input
is a whole disk, or when partscan was not requested.

Co-Authored-By: Clayton Craft <clayton@craftyguy.net>
src/shared/loop-util.c
src/test/test-loop-util.c