From 3ca5c24a1ade43f825383fef63a18d605599dbc7 Mon Sep 17 00:00:00 2001 From: Misaki Kasumi Date: Thu, 19 Dec 2024 17:45:37 +0800 Subject: [PATCH] mount: Support EROFS file-backed mounts --- libcomposefs/lcfs-mount.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libcomposefs/lcfs-mount.c b/libcomposefs/lcfs-mount.c index 780d6d14..d0649601 100644 --- a/libcomposefs/lcfs-mount.c +++ b/libcomposefs/lcfs-mount.c @@ -578,34 +578,40 @@ static errint_t lcfs_mount_erofs_ovl(struct lcfs_mount_state_s *state, char imagemountbuf[] = "/tmp/.composefs.XXXXXX"; char *imagemount; bool created_tmpdir = false; - char loopname[PATH_MAX]; + char source[PATH_MAX]; int errsv; errint_t err; int loopfd; image_flags = lcfs_u32_from_file(header->flags); - loopfd = setup_loopback(state->fd, state->image_path, loopname); - if (loopfd < 0) - return loopfd; - if (options->image_mountdir) { imagemount = (char *)options->image_mountdir; } else { imagemount = mkdtemp(imagemountbuf); if (imagemount == NULL) { errsv = errno; - close(loopfd); return -errsv; } created_tmpdir = true; } - err = lcfs_mount_erofs(loopname, imagemount, image_flags, state); - close(loopfd); + sprintf(source, "/dev/fd/%d", state->fd); + err = lcfs_mount_erofs(source, imagemount, image_flags, state); + if (err < 0) { - rmdir(imagemount); - return err; + /* Fallback to use loop device */ + loopfd = setup_loopback(state->fd, state->image_path, source); + if (loopfd < 0) + return loopfd; + + err = lcfs_mount_erofs(source, imagemount, image_flags, state); + + close(loopfd); + if (err < 0) { + rmdir(imagemount); + return err; + } } /* We use the legacy API to mount overlayfs, because the new API doesn't allow use