This patch introduces dump_xattr to create xattrs for dumped files.

Signed-off-by: Sheng Yong <shengyo...@huawei.com>
---
 fsck/dump.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 60 insertions(+), 3 deletions(-)

diff --git a/fsck/dump.c b/fsck/dump.c
index 90fd073..3d64cb7 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -11,6 +11,9 @@
 #include <inttypes.h>
 
 #include "fsck.h"
+#include "xattr.h"
+#include <attr/xattr.h>
+#include <linux/xattr.h>
 #include <locale.h>
 
 #define BUF_SZ 80
@@ -310,15 +313,67 @@ static void dump_node_blk(struct f2fs_sb_info *sbi, int 
ntype,
        free(node_blk);
 }
 
+static void dump_xattr(struct f2fs_sb_info *sbi, struct f2fs_node *node_blk)
+{
+       void *xattr;
+       struct f2fs_xattr_entry *ent;
+       char xattr_name[F2FS_NAME_LEN] = {0};
+       int ret;
+
+       xattr = read_all_xattrs(sbi, node_blk);
+
+       list_for_each_xattr(ent, xattr) {
+               char *name = strndup(ent->e_name, ent->e_name_len);
+               void *value = ent->e_name + ent->e_name_len;
+
+               if (!name)
+                       continue;
+
+               switch (ent->e_name_index) {
+               case F2FS_XATTR_INDEX_USER:
+                       ret = snprintf(xattr_name, F2FS_NAME_LEN, "%s%s",
+                                      XATTR_USER_PREFIX, name);
+                       break;
+
+               case F2FS_XATTR_INDEX_SECURITY:
+                       ret = snprintf(xattr_name, F2FS_NAME_LEN, "%s%s",
+                                      XATTR_SECURITY_PREFIX, name);
+                       break;
+               case F2FS_XATTR_INDEX_TRUSTED:
+                       ret = snprintf(xattr_name, F2FS_NAME_LEN, "%s%s",
+                                      XATTR_TRUSTED_PREFIX, name);
+                       break;
+               default:
+                       MSG(0, "Unknown xattr index 0x%x\n", ent->e_name_index);
+                       free(name);
+                       continue;
+               }
+               if (ret >= F2FS_NAME_LEN) {
+                       MSG(0, "XATTR index 0x%x name too long\n", 
ent->e_name_index);
+                       free(name);
+                       continue;
+               }
+
+               DBG(1, "fd %d xattr_name %s\n", c.dump_fd, xattr_name);
+               ret = fsetxattr(c.dump_fd, xattr_name, value,
+                               le16_to_cpu(ent->e_value_size), 0);
+               if (ret)
+                       MSG(0, "XATTR index 0x%x set xattr failed error %d\n",
+                           ent->e_name_index, errno);
+
+               free(name);
+       }
+
+       free(xattr);
+}
+
 static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
                                        struct f2fs_node *node_blk)
 {
        u32 i = 0;
        u64 ofs = 0;
 
-       /* TODO: need to dump xattr */
-
-       if((node_blk->i.i_inline & F2FS_INLINE_DATA)){
+       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,
@@ -345,6 +400,8 @@ static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 
nid,
                else
                        ASSERT(0);
        }
+
+       dump_xattr(sbi, node_blk);
 }
 
 static void dump_file(struct f2fs_sb_info *sbi, struct node_info *ni,
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to