From: Gao Xiang <hsiang...@aol.com>

"failed to find [%s] in canned fs_config" was observed by using
"--fs-config-file" option as reported by Yue Hu [1].

The root cause was that the mountpoint prefix to subdirectories is
also needed if "--mount-point" presents. However, such prefix cannot
be added by just using erofs_fspath().

One exception is that the root directory itself needs to be handled
specially for canned fs_config. For such case, the prefix of the root
directory has to be dropped instead.

[1] https://lkml.kernel.org/r/20201222020430.12512-1-zbest...@gmail.com

Fixes: 8a9e8046f170 ("AOSP: erofs-utils: add fs_config support")
Reported-by: Yue Hu <huy...@yulong.com>
Signed-off-by: Gao Xiang <hsiang...@aol.com>
---
Hi Yue, Jianan,

I've verified cuttlefish booting with success, It'd be better to
verify this patchset on your sides. Please kingly leave "Tested-by:"
if possible.

Hi Guifu,
Could you also review this patch ? This needs to be included in
the upcoming v1.2.1 as well...

Thanks,
Gao Xiang

 lib/inode.c | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/lib/inode.c b/lib/inode.c
index 0c4839dc7152..f88966d26fce 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -696,32 +696,43 @@ int erofs_droid_inode_fsconfig(struct erofs_inode *inode,
        /* filesystem_config does not preserve file type bits */
        mode_t stat_file_type_mask = st->st_mode & S_IFMT;
        unsigned int uid = 0, gid = 0, mode = 0;
-       char *fspath;
+       const char *fspath;
+       char *decorated = NULL;
 
        inode->capabilities = 0;
+       if (!cfg.fs_config_file && !cfg.mount_point)
+               return 0;
+
+       if (!cfg.mount_point ||
+       /* have to drop the mountpoint for rootdir of canned fsconfig */
+           (cfg.fs_config_file && IS_ROOT(inode))) {
+               fspath = erofs_fspath(path);
+       } else {
+               if (asprintf(&decorated, "%s/%s", cfg.mount_point,
+                            erofs_fspath(path)) <= 0)
+                       return -ENOMEM;
+               fspath = decorated;
+       }
+
        if (cfg.fs_config_file)
-               canned_fs_config(erofs_fspath(path),
+               canned_fs_config(fspath,
                                 S_ISDIR(st->st_mode),
                                 cfg.target_out_path,
                                 &uid, &gid, &mode, &inode->capabilities);
-       else if (cfg.mount_point) {
-               if (asprintf(&fspath, "%s/%s", cfg.mount_point,
-                            erofs_fspath(path)) <= 0)
-                       return -ENOMEM;
-
+       else
                fs_config(fspath, S_ISDIR(st->st_mode),
                          cfg.target_out_path,
                          &uid, &gid, &mode, &inode->capabilities);
-               free(fspath);
-       }
-       st->st_uid = uid;
-       st->st_gid = gid;
-       st->st_mode = mode | stat_file_type_mask;
 
        erofs_dbg("/%s -> mode = 0x%x, uid = 0x%x, gid = 0x%x, "
                  "capabilities = 0x%" PRIx64 "\n",
-                 erofs_fspath(path),
-                 mode, uid, gid, inode->capabilities);
+                 fspath, mode, uid, gid, inode->capabilities);
+
+       if (decorated)
+               free(decorated);
+       st->st_uid = uid;
+       st->st_gid = gid;
+       st->st_mode = mode | stat_file_type_mask;
        return 0;
 }
 #else
-- 
2.24.0

Reply via email to