@@ -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,
Xattrs for files with inline data were being skipped. This dumps those, as well as xattrs for folders. Signed-off-by: Daniel Rosenberg <drosen@google.com> --- fsck/dump.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)