b24413180f560 (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) /* SPDX-License-Identifier: GPL-2.0 */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 2) /*
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 3) File: linux/ext2_xattr.h
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 4)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 5) On-disk format of extended attributes for the ext2 filesystem.
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 6)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 7) (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 8) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 9)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 10) #include <linux/init.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 11) #include <linux/xattr.h>
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 12)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 13) /* Magic value in attribute blocks */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 14) #define EXT2_XATTR_MAGIC 0xEA020000
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 15)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 16) /* Maximum number of references to one attribute block */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 17) #define EXT2_XATTR_REFCOUNT_MAX 1024
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 18)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 19) /* Name indexes */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 20) #define EXT2_XATTR_INDEX_USER 1
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 21) #define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 22) #define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 23) #define EXT2_XATTR_INDEX_TRUSTED 4
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 24) #define EXT2_XATTR_INDEX_LUSTRE 5
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 25) #define EXT2_XATTR_INDEX_SECURITY 6
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 26)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 27) struct ext2_xattr_header {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 28) __le32 h_magic; /* magic number for identification */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 29) __le32 h_refcount; /* reference count */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 30) __le32 h_blocks; /* number of disk blocks used */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 31) __le32 h_hash; /* hash value of all attributes */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 32) __u32 h_reserved[4]; /* zero right now */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 33) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 34)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 35) struct ext2_xattr_entry {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 36) __u8 e_name_len; /* length of name */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 37) __u8 e_name_index; /* attribute name index */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 38) __le16 e_value_offs; /* offset in disk block of value */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 39) __le32 e_value_block; /* disk block attribute is stored on (n/i) */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 40) __le32 e_value_size; /* size of attribute value */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 41) __le32 e_hash; /* hash value of name and value */
c2d0699c629d3 (Gustavo A. R. Silva 2020-03-09 13:04:41 -0500 42) char e_name[]; /* attribute name */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 43) };
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 44)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 45) #define EXT2_XATTR_PAD_BITS 2
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 46) #define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 47) #define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 48) #define EXT2_XATTR_LEN(name_len) \
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 49) (((name_len) + EXT2_XATTR_ROUND + \
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 50) sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 51) #define EXT2_XATTR_NEXT(entry) \
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 52) ( (struct ext2_xattr_entry *)( \
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 53) (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) )
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 54) #define EXT2_XATTR_SIZE(size) \
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 55) (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 56)
7a2508e1b657c (Jan Kara 2016-02-22 22:35:22 -0500 57) struct mb_cache;
be0726d33cb8f (Jan Kara 2016-02-22 11:56:38 -0500 58)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 59) # ifdef CONFIG_EXT2_FS_XATTR
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 60)
749c72efa4bd9 (Stephen Hemminger 2010-05-13 17:53:16 -0700 61) extern const struct xattr_handler ext2_xattr_user_handler;
749c72efa4bd9 (Stephen Hemminger 2010-05-13 17:53:16 -0700 62) extern const struct xattr_handler ext2_xattr_trusted_handler;
749c72efa4bd9 (Stephen Hemminger 2010-05-13 17:53:16 -0700 63) extern const struct xattr_handler ext2_xattr_security_handler;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 64)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 65) extern ssize_t ext2_listxattr(struct dentry *, char *, size_t);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 66)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 67) extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 68) extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 69)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 70) extern void ext2_xattr_delete_inode(struct inode *);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71)
7a2508e1b657c (Jan Kara 2016-02-22 22:35:22 -0500 72) extern struct mb_cache *ext2_xattr_create_cache(void);
7a2508e1b657c (Jan Kara 2016-02-22 22:35:22 -0500 73) extern void ext2_xattr_destroy_cache(struct mb_cache *cache);
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74)
749c72efa4bd9 (Stephen Hemminger 2010-05-13 17:53:16 -0700 75) extern const struct xattr_handler *ext2_xattr_handlers[];
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 76)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 77) # else /* CONFIG_EXT2_FS_XATTR */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 78)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 79) static inline int
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 80) ext2_xattr_get(struct inode *inode, int name_index,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 81) const char *name, void *buffer, size_t size)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 82) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 83) return -EOPNOTSUPP;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 84) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 85)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 86) static inline int
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 87) ext2_xattr_set(struct inode *inode, int name_index, const char *name,
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 88) const void *value, size_t size, int flags)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 89) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 90) return -EOPNOTSUPP;
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 91) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 92)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 93) static inline void
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 94) ext2_xattr_delete_inode(struct inode *inode)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 95) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 96) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 97)
7a2508e1b657c (Jan Kara 2016-02-22 22:35:22 -0500 98) static inline void ext2_xattr_destroy_cache(struct mb_cache *cache)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 99) {
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 100) }
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 101)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 102) #define ext2_xattr_handlers NULL
91a087153d9db (Chengguang Xu 2020-05-22 12:40:35 +0800 103) #define ext2_listxattr NULL
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 104)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 105) # endif /* CONFIG_EXT2_FS_XATTR */
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 106)
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 107) #ifdef CONFIG_EXT2_FS_SECURITY
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 108) extern int ext2_init_security(struct inode *inode, struct inode *dir,
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 109) const struct qstr *qstr);
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 110) #else
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 111) static inline int ext2_init_security(struct inode *inode, struct inode *dir,
2a7dba391e562 (Eric Paris 2011-02-01 11:05:39 -0500 112) const struct qstr *qstr)
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 113) {
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 114) return 0;
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 115) }
10f47e6a1b8b2 (Stephen Smalley 2005-09-09 13:01:39 -0700 116) #endif