Message ID | 20240523224700.265251-2-drosen@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [f2fs-dev,v4,1/2] dump.f2fs: Add ability to dump folders | expand |
On Thu, May 23, 2024 at 3:48 PM Daniel Rosenberg via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net> wrote: > > 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> > Reviewed-by: Daeho Jeong <daehojeong@google.com> > --- > fsck/dump.c | 39 +++++++++++++++++++++++++++------------ > 1 file changed, 27 insertions(+), 12 deletions(-) > > diff --git a/fsck/dump.c b/fsck/dump.c > index fa68456..90e3e0e 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,12 +431,24 @@ 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, > - XATTR_CREATE); > + if (is_dir) { > + ret = setxattr(".", xattr_name, value, > + le16_to_cpu(ent->e_value_size), 0, > + XATTR_CREATE); > + } else { > + ret = fsetxattr(c.dump_fd, xattr_name, value, > + le16_to_cpu(ent->e_value_size), 0, > + XATTR_CREATE); > + } > #endif > if (ret) > MSG(0, "XATTR index 0x%x set xattr failed error %d\n", > @@ -449,7 +461,7 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk) > } > #else > static void dump_xattr(struct f2fs_sb_info *UNUSED(sbi), > - struct f2fs_node *UNUSED(node_blk)) > + struct f2fs_node *UNUSED(node_blk), int UNUSED(is_dir)) > { > MSG(0, "XATTR does not support\n"); > } > @@ -462,13 +474,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 +494,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 +531,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.1.288.g0e0cd299f1-goog > > Reviewed-by: Daeho Jeong <daehojeong@google.com> Thanks, > > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
On 2024/5/24 6:47, Daniel Rosenberg wrote: > 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> > Reviewed-by: Daeho Jeong <daehojeong@google.com> Reviewed-by: Chao Yu <chao@kernel.org> Thanks,
diff --git a/fsck/dump.c b/fsck/dump.c index fa68456..90e3e0e 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,12 +431,24 @@ 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, - XATTR_CREATE); + if (is_dir) { + ret = setxattr(".", xattr_name, value, + le16_to_cpu(ent->e_value_size), 0, + XATTR_CREATE); + } else { + ret = fsetxattr(c.dump_fd, xattr_name, value, + le16_to_cpu(ent->e_value_size), 0, + XATTR_CREATE); + } #endif if (ret) MSG(0, "XATTR index 0x%x set xattr failed error %d\n", @@ -449,7 +461,7 @@ static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk) } #else static void dump_xattr(struct f2fs_sb_info *UNUSED(sbi), - struct f2fs_node *UNUSED(node_blk)) + struct f2fs_node *UNUSED(node_blk), int UNUSED(is_dir)) { MSG(0, "XATTR does not support\n"); } @@ -462,13 +474,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 +494,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 +531,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,