^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * fs/f2fs/xattr.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2012 Samsung Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * http://www.samsung.com/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Portions of this code from linux/fs/ext2/xattr.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * On-disk format of extended attributes for the ext2 filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifndef __F2FS_XATTR_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define __F2FS_XATTR_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/xattr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /* Magic value in attribute blocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define F2FS_XATTR_MAGIC 0xF2F52011
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* Maximum number of references to one attribute block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define F2FS_XATTR_REFCOUNT_MAX 1024
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* Name indexes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define F2FS_SYSTEM_ADVISE_NAME "system.advise"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define F2FS_XATTR_INDEX_USER 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define F2FS_XATTR_INDEX_POSIX_ACL_ACCESS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define F2FS_XATTR_INDEX_POSIX_ACL_DEFAULT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define F2FS_XATTR_INDEX_TRUSTED 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define F2FS_XATTR_INDEX_LUSTRE 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define F2FS_XATTR_INDEX_SECURITY 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define F2FS_XATTR_INDEX_ADVISE 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* Should be same as EXT4_XATTR_INDEX_ENCRYPTION */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define F2FS_XATTR_INDEX_ENCRYPTION 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define F2FS_XATTR_INDEX_VERITY 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define F2FS_XATTR_NAME_ENCRYPTION_CONTEXT "c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define F2FS_XATTR_NAME_VERITY "v"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct f2fs_xattr_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) __le32 h_magic; /* magic number for identification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) __le32 h_refcount; /* reference count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) __u32 h_reserved[4]; /* zero right now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct f2fs_xattr_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) __u8 e_name_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) __u8 e_name_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) __le16 e_value_size; /* size of attribute value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) char e_name[]; /* attribute name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define XATTR_HDR(ptr) ((struct f2fs_xattr_header *)(ptr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define XATTR_ENTRY(ptr) ((struct f2fs_xattr_entry *)(ptr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define XATTR_FIRST_ENTRY(ptr) (XATTR_ENTRY(XATTR_HDR(ptr) + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define XATTR_ROUND (3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define XATTR_ALIGN(size) (((size) + XATTR_ROUND) & ~XATTR_ROUND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define ENTRY_SIZE(entry) (XATTR_ALIGN(sizeof(struct f2fs_xattr_entry) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) (entry)->e_name_len + le16_to_cpu((entry)->e_value_size)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define XATTR_NEXT_ENTRY(entry) ((struct f2fs_xattr_entry *)((char *)(entry) +\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ENTRY_SIZE(entry)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define IS_XATTR_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define list_for_each_xattr(entry, addr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) for (entry = XATTR_FIRST_ENTRY(addr);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) !IS_XATTR_LAST_ENTRY(entry);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) entry = XATTR_NEXT_ENTRY(entry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define VALID_XATTR_BLOCK_SIZE (PAGE_SIZE - sizeof(struct node_footer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define XATTR_PADDING_SIZE (sizeof(__u32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define XATTR_SIZE(i) ((F2FS_I(i)->i_xattr_nid ? \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) VALID_XATTR_BLOCK_SIZE : 0) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) (inline_xattr_size(i)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define MIN_OFFSET(i) XATTR_ALIGN(inline_xattr_size(i) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) VALID_XATTR_BLOCK_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define MAX_VALUE_LEN(i) (MIN_OFFSET(i) - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) sizeof(struct f2fs_xattr_header) - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) sizeof(struct f2fs_xattr_entry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define MAX_INLINE_XATTR_SIZE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) (DEF_ADDRS_PER_INODE - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) DEF_INLINE_RESERVED_SIZE - \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) MIN_INLINE_DENTRY_SIZE / sizeof(__le32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * On-disk structure of f2fs_xattr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * We use inline xattrs space + 1 block for xattr.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * +--------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * | f2fs_xattr_header |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * +--------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * | f2fs_xattr_entry |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * | .e_name_index = 1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * | .e_name_len = 3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * | .e_value_size = 14 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * | .e_name = "foo" |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * | "value_of_xattr" |<- value_offs = e_name + e_name_len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * +--------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) * | f2fs_xattr_entry |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * | .e_name_index = 4 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) * | .e_name = "bar" |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * +--------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) * | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * | Free |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * +--------------------+<- MIN_OFFSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * | node_footer |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * | (nid, ino, offset) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * +--------------------+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) **/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #ifdef CONFIG_F2FS_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) extern const struct xattr_handler f2fs_xattr_user_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) extern const struct xattr_handler f2fs_xattr_trusted_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) extern const struct xattr_handler f2fs_xattr_advise_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) extern const struct xattr_handler f2fs_xattr_security_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) extern const struct xattr_handler *f2fs_xattr_handlers[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) extern int f2fs_setxattr(struct inode *, int, const char *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) const void *, size_t, struct page *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) extern int f2fs_getxattr(struct inode *, int, const char *, void *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) size_t, struct page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) extern ssize_t f2fs_listxattr(struct dentry *, char *, size_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) extern int f2fs_init_xattr_caches(struct f2fs_sb_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) extern void f2fs_destroy_xattr_caches(struct f2fs_sb_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define f2fs_xattr_handlers NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define f2fs_listxattr NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static inline int f2fs_setxattr(struct inode *inode, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) const char *name, const void *value, size_t size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct page *page, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static inline int f2fs_getxattr(struct inode *inode, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) const char *name, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) size_t buffer_size, struct page *dpage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) static inline int f2fs_init_xattr_caches(struct f2fs_sb_info *sbi) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static inline void f2fs_destroy_xattr_caches(struct f2fs_sb_info *sbi) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #ifdef CONFIG_F2FS_FS_SECURITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) extern int f2fs_init_security(struct inode *, struct inode *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) const struct qstr *, struct page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static inline int f2fs_init_security(struct inode *inode, struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) const struct qstr *qstr, struct page *ipage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #endif /* __F2FS_XATTR_H__ */