1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds File: linux/ext2_xattr.h 41da177e4SLinus Torvalds 51da177e4SLinus Torvalds On-disk format of extended attributes for the ext2 filesystem. 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/init.h> 111da177e4SLinus Torvalds #include <linux/xattr.h> 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds /* Magic value in attribute blocks */ 141da177e4SLinus Torvalds #define EXT2_XATTR_MAGIC 0xEA020000 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds /* Maximum number of references to one attribute block */ 171da177e4SLinus Torvalds #define EXT2_XATTR_REFCOUNT_MAX 1024 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds /* Name indexes */ 201da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_USER 1 211da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 221da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 231da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_TRUSTED 4 241da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_LUSTRE 5 251da177e4SLinus Torvalds #define EXT2_XATTR_INDEX_SECURITY 6 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds struct ext2_xattr_header { 281da177e4SLinus Torvalds __le32 h_magic; /* magic number for identification */ 291da177e4SLinus Torvalds __le32 h_refcount; /* reference count */ 301da177e4SLinus Torvalds __le32 h_blocks; /* number of disk blocks used */ 311da177e4SLinus Torvalds __le32 h_hash; /* hash value of all attributes */ 321da177e4SLinus Torvalds __u32 h_reserved[4]; /* zero right now */ 331da177e4SLinus Torvalds }; 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds struct ext2_xattr_entry { 361da177e4SLinus Torvalds __u8 e_name_len; /* length of name */ 371da177e4SLinus Torvalds __u8 e_name_index; /* attribute name index */ 381da177e4SLinus Torvalds __le16 e_value_offs; /* offset in disk block of value */ 391da177e4SLinus Torvalds __le32 e_value_block; /* disk block attribute is stored on (n/i) */ 401da177e4SLinus Torvalds __le32 e_value_size; /* size of attribute value */ 411da177e4SLinus Torvalds __le32 e_hash; /* hash value of name and value */ 421da177e4SLinus Torvalds char e_name[0]; /* attribute name */ 431da177e4SLinus Torvalds }; 441da177e4SLinus Torvalds 451da177e4SLinus Torvalds #define EXT2_XATTR_PAD_BITS 2 461da177e4SLinus Torvalds #define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) 471da177e4SLinus Torvalds #define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) 481da177e4SLinus Torvalds #define EXT2_XATTR_LEN(name_len) \ 491da177e4SLinus Torvalds (((name_len) + EXT2_XATTR_ROUND + \ 501da177e4SLinus Torvalds sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) 511da177e4SLinus Torvalds #define EXT2_XATTR_NEXT(entry) \ 521da177e4SLinus Torvalds ( (struct ext2_xattr_entry *)( \ 531da177e4SLinus Torvalds (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) 541da177e4SLinus Torvalds #define EXT2_XATTR_SIZE(size) \ 551da177e4SLinus Torvalds (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) 561da177e4SLinus Torvalds 577a2508e1SJan Kara struct mb_cache; 58be0726d3SJan Kara 591da177e4SLinus Torvalds # ifdef CONFIG_EXT2_FS_XATTR 601da177e4SLinus Torvalds 61749c72efSStephen Hemminger extern const struct xattr_handler ext2_xattr_user_handler; 62749c72efSStephen Hemminger extern const struct xattr_handler ext2_xattr_trusted_handler; 63749c72efSStephen Hemminger extern const struct xattr_handler ext2_xattr_security_handler; 641da177e4SLinus Torvalds 651da177e4SLinus Torvalds extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); 681da177e4SLinus Torvalds extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds extern void ext2_xattr_delete_inode(struct inode *); 711da177e4SLinus Torvalds 727a2508e1SJan Kara extern struct mb_cache *ext2_xattr_create_cache(void); 737a2508e1SJan Kara extern void ext2_xattr_destroy_cache(struct mb_cache *cache); 741da177e4SLinus Torvalds 75749c72efSStephen Hemminger extern const struct xattr_handler *ext2_xattr_handlers[]; 761da177e4SLinus Torvalds 771da177e4SLinus Torvalds # else /* CONFIG_EXT2_FS_XATTR */ 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds static inline int 801da177e4SLinus Torvalds ext2_xattr_get(struct inode *inode, int name_index, 811da177e4SLinus Torvalds const char *name, void *buffer, size_t size) 821da177e4SLinus Torvalds { 831da177e4SLinus Torvalds return -EOPNOTSUPP; 841da177e4SLinus Torvalds } 851da177e4SLinus Torvalds 861da177e4SLinus Torvalds static inline int 871da177e4SLinus Torvalds ext2_xattr_set(struct inode *inode, int name_index, const char *name, 881da177e4SLinus Torvalds const void *value, size_t size, int flags) 891da177e4SLinus Torvalds { 901da177e4SLinus Torvalds return -EOPNOTSUPP; 911da177e4SLinus Torvalds } 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds static inline void 941da177e4SLinus Torvalds ext2_xattr_delete_inode(struct inode *inode) 951da177e4SLinus Torvalds { 961da177e4SLinus Torvalds } 971da177e4SLinus Torvalds 987a2508e1SJan Kara static inline void ext2_xattr_destroy_cache(struct mb_cache *cache) 991da177e4SLinus Torvalds { 1001da177e4SLinus Torvalds } 1011da177e4SLinus Torvalds 1021da177e4SLinus Torvalds #define ext2_xattr_handlers NULL 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds # endif /* CONFIG_EXT2_FS_XATTR */ 1051da177e4SLinus Torvalds 10610f47e6aSStephen Smalley #ifdef CONFIG_EXT2_FS_SECURITY 1072a7dba39SEric Paris extern int ext2_init_security(struct inode *inode, struct inode *dir, 1082a7dba39SEric Paris const struct qstr *qstr); 10910f47e6aSStephen Smalley #else 1102a7dba39SEric Paris static inline int ext2_init_security(struct inode *inode, struct inode *dir, 1112a7dba39SEric Paris const struct qstr *qstr) 11210f47e6aSStephen Smalley { 11310f47e6aSStephen Smalley return 0; 11410f47e6aSStephen Smalley } 11510f47e6aSStephen Smalley #endif 116