Xattrs for files with inline data were being skipped. This dumps those,
as well as xattrs for folders.

Signed-off-by: Daniel Rosenberg <dro...@google.com>
---
 fsck/dump.c | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/fsck/dump.c b/fsck/dump.c
index f60f6f9..3bd17e3 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -377,7 +377,7 @@ static void dump_node_blk(struct f2fs_sb_info *sbi, int 
ntype,
 }
 
 #ifdef HAVE_FSETXATTR
-static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
+static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk, 
int is_dir)
 {
        void *xattr;
        void *last_base_addr;
@@ -431,8 +431,14 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct 
f2fs_node *node_blk)
 
                DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
 #if defined(__linux__)
-               ret = fsetxattr(c.dump_fd, xattr_name, value,
-                               le16_to_cpu(ent->e_value_size), 0);
+               if (is_dir) {
+                       ret = setxattr(".", xattr_name, value,
+                                                       
le16_to_cpu(ent->e_value_size), 0);
+               } else {
+                       ret = fsetxattr(c.dump_fd, xattr_name, value,
+                                                       
le16_to_cpu(ent->e_value_size), 0);
+               }
+
 #elif defined(__APPLE__)
                ret = fsetxattr(c.dump_fd, xattr_name, value,
                                le16_to_cpu(ent->e_value_size), 0,
@@ -462,13 +468,15 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 
nid,
        u64 ofs = 0;
        u32 addr_per_block;
        bool is_dir = S_ISDIR(le16_to_cpu(node_blk->i.i_mode));
+       int ret = 0;
 
        if ((node_blk->i.i_inline & F2FS_INLINE_DATA)) {
                DBG(3, "ino[0x%x] has inline data!\n", nid);
                /* recover from inline data */
                dev_write_dump(((unsigned char *)node_blk) + INLINE_DATA_OFFSET,
                                                0, MAX_INLINE_DATA(node_blk));
-               return -1;
+               ret = -1;
+               goto dump_xattr;
        }
 
        if ((node_blk->i.i_inline & F2FS_INLINE_DENTRY)) {
@@ -480,7 +488,8 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
                DBG(3, "ino[0x%x] has inline dentries!\n", nid);
                /* recover from inline dentry */
                dump_folder_contents(sbi, d.bitmap, d.dentry, d.filename, 
d.max);
-               return -1;
+               ret = -1;
+               goto dump_xattr;
        }
 
        c.show_file_map_max_offset = f2fs_max_file_offset(&node_blk->i);
@@ -516,9 +525,9 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
        }
        /* last block in extent cache */
        print_extent(true);
-
-       dump_xattr(sbi, node_blk);
-       return 0;
+dump_xattr:
+       dump_xattr(sbi, node_blk, is_dir);
+       return ret;
 }
 
 static void dump_file(struct f2fs_sb_info *sbi, struct node_info *ni,
-- 
2.45.0.rc1.225.g2a3ae87e7f-goog



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to