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

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

Fix an issue which behaves the same as the following
mkisofs BZ due to bindmount:
https://bugzilla.redhat.com/show_bug.cgi?id=1749860

Fixes: a17497f0844a ("erofs-utils: introduce inode operations")
Signed-off-by: Gao Xiang <hsiang...@aol.com>
---
regression testcases will be uploaded to:
https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git/log/?h=experimental-tests
for now (erofs-utils v1.3 will include testcases then.)

 lib/inode.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/lib/inode.c b/lib/inode.c
index 388d21db3845..1cf813daa396 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -823,9 +823,16 @@ struct erofs_inode *erofs_iget_from_path(const char *path, 
bool is_src)
        if (ret)
                return ERR_PTR(-errno);
 
-       inode = erofs_iget(st.st_ino);
-       if (inode)
-               return inode;
+       /*
+        * lookup in hash table first, if it already exists we have a
+        * hard-link, just return it. Also don't lookup for directories
+        * since hard-link directory isn't allowed.
+        */
+       if (!S_ISDIR(st.st_mode)) {
+               inode = erofs_iget(st.st_ino);
+               if (inode)
+                       return inode;
+       }
 
        /* cannot find in the inode cache */
        inode = erofs_new_inode();
-- 
2.24.0

Reply via email to