On 2017/10/31 17:02, Sheng Yong wrote: > > > On 2017/10/31 15:51, Chao Yu wrote: >> On 2017/10/31 9:38, Sheng Yong wrote: > [...] >>> + >>> +void print_xattr_entry(struct f2fs_xattr_entry *ent) >>> +{ >>> + char *value = (char *)(ent->e_name + le16_to_cpu(ent->e_name_len)); >>> + struct fscrypt_context *ctx; >>> + int i; >>> + >>> + MSG(0, "\nxattr: e_name_index:%d e_name:", ent->e_name_index); >>> + for (i = 0; i < le16_to_cpu(ent->e_name_len); i++) >>> + MSG(0, "%c", ent->e_name[i]); >>> + MSG(0, " e_name_len:%d e_value_size:%d e_value:\n", >>> + ent->e_name_len, le16_to_cpu(ent->e_value_size)); >>> + >>> + switch (ent->e_name_index) { >>> + case F2FS_XATTR_INDEX_USER: >>> + case F2FS_XATTR_INDEX_SECURITY: >>> + for (i = 0; i < le16_to_cpu(ent->e_value_size); i++) >>> + MSG(0, "%c", value[i]); >> >> It could be unreadable if user stores pure value in xattr entry. > Actually, I'm not quite sure about the value of each type of xattr. But does > USER xattr contain only plain text?
IIRC, there is no such restriction, value can be any type, with variable length. Thanks, > > thanks, > Sheng >> >> Thanks, >> >>> + MSG(0, "\n"); >>> + break; >>> + case F2FS_XATTR_INDEX_POSIX_ACL_ACCESS: >>> + case F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT: >>> + print_acl(value, le16_to_cpu(ent->e_value_size)); >>> + break; >>> + case F2FS_XATTR_INDEX_TRUSTED: >>> + case F2FS_XATTR_INDEX_LUSTRE: >>> + for (i = 0; i < le16_to_cpu(ent->e_value_size); i++) >>> + MSG(0, "%02X", value[i]); >>> + MSG(0, "\n"); >>> + break; >>> + case F2FS_XATTR_INDEX_ENCRYPTION: >>> + ctx = (struct fscrypt_context *)value; >>> + MSG(0, "format: %d\n", ctx->format); >>> + MSG(0, "contents_encryption_mode: 0x%x\n", >>> ctx->contents_encryption_mode); >>> + MSG(0, "filenames_encryption_mode: 0x%x\n", >>> ctx->filenames_encryption_mode); >>> + MSG(0, "flags: 0x%x\n", ctx->flags); >>> + MSG(0, "master_key_descriptor: "); >>> + for (i = 0; i < FS_KEY_DESCRIPTOR_SIZE; i++) >>> + MSG(0, "%02X", ctx->master_key_descriptor[i]); >>> + MSG(0, "\nnonce: "); >>> + for (i = 0; i < FS_KEY_DERIVATION_NONCE_SIZE; i++) >>> + MSG(0, "%02X", ctx->nonce[i]); >>> + MSG(0, "\n"); >>> + break; >>> + default: >>> + break; >>> + } >>> +} >>> + >>> +void print_inode_info(struct f2fs_sb_info *sbi, >>> + struct f2fs_node *node, int name) >>> +{ >>> + struct f2fs_inode *inode = &node->i; >>> + void *xattr_addr; >>> + struct f2fs_xattr_entry *ent; >>> unsigned char en[F2FS_NAME_LEN + 1]; >>> unsigned int i = 0; >>> int namelen = le32_to_cpu(inode->i_namelen); >>> @@ -111,17 +225,24 @@ void print_inode_info(struct f2fs_inode *inode, int >>> name) >>> DISP_u32(inode, i_nid[3]); /* indirect */ >>> DISP_u32(inode, i_nid[4]); /* double indirect */ >>> >>> + xattr_addr = read_all_xattrs(sbi, node); >>> + list_for_each_xattr(ent, xattr_addr) { >>> + print_xattr_entry(ent); >>> + } >>> + free(xattr_addr); >>> + >>> printf("\n"); >>> } >>> >>> -void print_node_info(struct f2fs_node *node_block, int verbose) >>> +void print_node_info(struct f2fs_sb_info *sbi, >>> + struct f2fs_node *node_block, int verbose) >>> { >>> nid_t ino = le32_to_cpu(node_block->footer.ino); >>> nid_t nid = le32_to_cpu(node_block->footer.nid); >>> /* Is this inode? */ >>> if (ino == nid) { >>> DBG(verbose, "Node ID [0x%x:%u] is inode\n", nid, nid); >>> - print_inode_info(&node_block->i, verbose); >>> + print_inode_info(sbi, node_block, verbose); >>> } else { >>> int i; >>> u32 *dump_blk = (u32 *)node_block; >>> diff --git a/fsck/xattr.c b/fsck/xattr.c >>> index 3f5c7d3..1d0f7d3 100644 >>> --- a/fsck/xattr.c >>> +++ b/fsck/xattr.c >>> @@ -20,7 +20,7 @@ >>> #define XATTR_CREATE 0x1 >>> #define XATTR_REPLACE 0x2 >>> >>> -static void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node >>> *inode) >>> +void *read_all_xattrs(struct f2fs_sb_info *sbi, struct f2fs_node *inode) >>> { >>> struct f2fs_xattr_header *header; >>> void *txattr_addr; >>> diff --git a/fsck/xattr.h b/fsck/xattr.h >>> index b414629..beed3bb 100644 >>> --- a/fsck/xattr.h >>> +++ b/fsck/xattr.h >>> @@ -31,10 +31,62 @@ struct f2fs_xattr_entry { >>> char e_name[0]; /* attribute name */ >>> }; >>> >>> +#define FS_KEY_DESCRIPTOR_SIZE 8 >>> +#define FS_KEY_DERIVATION_NONCE_SIZE 16 >>> + >>> +struct fscrypt_context { >>> + u8 format; >>> + u8 contents_encryption_mode; >>> + u8 filenames_encryption_mode; >>> + u8 flags; >>> + u8 master_key_descriptor[FS_KEY_DESCRIPTOR_SIZE]; >>> + u8 nonce[FS_KEY_DERIVATION_NONCE_SIZE]; >>> +} __attribute__((packed)); >>> + >>> +#define F2FS_ACL_VERSION 0x0001 >>> + >>> +struct f2fs_acl_entry { >>> + __le16 e_tag; >>> + __le16 e_perm; >>> + __le32 e_id; >>> +}; >>> + >>> +struct f2fs_acl_entry_short { >>> + __le16 e_tag; >>> + __le16 e_perm; >>> +}; >>> + >>> +struct f2fs_acl_header { >>> + __le32 a_version; >>> +}; >>> + >>> +static inline int f2fs_acl_count(int size) >>> +{ >>> + ssize_t s; >>> + size -= sizeof(struct f2fs_acl_header); >>> + s = size - 4 * sizeof(struct f2fs_acl_entry_short); >>> + if (s < 0) { >>> + if (size % sizeof(struct f2fs_acl_entry_short)) >>> + return -1; >>> + return size / sizeof(struct f2fs_acl_entry_short); >>> + } else { >>> + if (s % sizeof(struct f2fs_acl_entry)) >>> + return -1; >>> + return s / sizeof(struct f2fs_acl_entry) + 4; >>> + } >>> +} >>> + >>> #define XATTR_ROUND (3) >>> >>> #define XATTR_SELINUX_SUFFIX "selinux" >>> -#define F2FS_XATTR_INDEX_SECURITY 6 >>> +#define F2FS_XATTR_INDEX_USER 1 >>> +#define F2FS_XATTR_INDEX_POSIX_ACL_ACCESS 2 >>> +#define F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT 3 >>> +#define F2FS_XATTR_INDEX_TRUSTED 4 >>> +#define F2FS_XATTR_INDEX_LUSTRE 5 >>> +#define F2FS_XATTR_INDEX_SECURITY 6 >>> +#define F2FS_XATTR_INDEX_ENCRYPTION 9 >>> + >>> #define IS_XATTR_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) >>> >>> #define XATTR_HDR(ptr) ((struct f2fs_xattr_header *)(ptr)) >>> >> >> >> . >> > > > . > ------------------------------------------------------------------------------ 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