From: Yu Watanabe Date: Wed, 30 Nov 2022 03:55:13 +0000 (+0900) Subject: dissect: support to unmount image without root partition X-Git-Tag: v253-rc1~382^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41a95b18bd5dfbaee583270768f156f5b39c8499;p=thirdparty%2Fsystemd.git dissect: support to unmount image without root partition Fixes #25480. --- diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 395294ebb42..3892bfb208b 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -1194,6 +1194,19 @@ static int action_umount(const char *path) { return log_error_errno(r, "Failed to determine whether '%s' is a mount point: %m", canonical); r = block_device_new_from_fd(fd, BLOCK_DEVICE_LOOKUP_WHOLE_DISK | BLOCK_DEVICE_LOOKUP_BACKING, &dev); + if (r < 0) { + _cleanup_close_ int usr_fd = -1; + + /* The command `systemd-dissect --mount` expects that the image at least has the root or /usr + * partition. If it does not have the root partition, then we mount the /usr partition on a + * tmpfs. Hence, let's try to find the backing block device through the /usr partition. */ + + usr_fd = openat(fd, "usr", O_CLOEXEC | O_DIRECTORY | O_NOFOLLOW); + if (usr_fd < 0) + return log_error_errno(errno, "Failed to open '%s/usr': %m", canonical); + + r = block_device_new_from_fd(usr_fd, BLOCK_DEVICE_LOOKUP_WHOLE_DISK | BLOCK_DEVICE_LOOKUP_BACKING, &dev); + } if (r < 0) return log_error_errno(r, "Failed to find backing block device for '%s': %m", canonical);