On 2017/10/31 9:38, Sheng Yong wrote:
> 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..01889fd 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), XATTR_CREATE);
> +             if (ret)

if (ret == -EEXIST)
        fsetxattr(,,,,XATTR_REPLACE)?

Thanks,

> +                     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,
> 


------------------------------------------------------------------------------
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