]> git.ipfire.org Git - thirdparty/systemd.git/commit
loop-util: don't reuse partition fd when partscan needed
authorClayton Craft <clayton@craftyguy.net>
Tue, 28 Apr 2026 02:38:26 +0000 (19:38 -0700)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 22 May 2026 12:57:29 +0000 (13:57 +0100)
commit663f0bf5cb79ecaf6dd71441ecdc9dc401e7eae6
tree36869e4e2f03000e64b1f1ab94934071f59e01e8
parent02ffebc343a3da9635006d02cf0af42a299623b2
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>
(cherry picked from commit 47d408163b0b71e5f8fed6b2e520c053cefc5780)
src/shared/loop-util.c
src/test/test-loop-util.c