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