diff mbox series

[f2fs-dev,v4,2/2] dump.f2fs: Fix xattr dumping

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

Commit Message

Daniel Rosenberg May 23, 2024, 10:47 p.m. UTC
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(-)

Comments

Daeho Jeong May 23, 2024, 11:34 p.m. UTC | #1
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
Chao Yu May 29, 2024, 6:41 a.m. UTC | #2
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 mbox series

Patch

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,