1652ecc20SKaiGai Kohei /* 2652ecc20SKaiGai Kohei * JFFS2 -- Journalling Flash File System, Version 2. 3aa98d7cfSKaiGai Kohei * 4c00c310eSDavid Woodhouse * Copyright © 2006 NEC Corporation 5aa98d7cfSKaiGai Kohei * 6652ecc20SKaiGai Kohei * Created by KaiGai Kohei <kaigai@ak.jp.nec.com> 7652ecc20SKaiGai Kohei * 8652ecc20SKaiGai Kohei * For licensing information, see the file 'LICENCE' in this directory. 9652ecc20SKaiGai Kohei * 10652ecc20SKaiGai Kohei */ 11c00c310eSDavid Woodhouse 12aa98d7cfSKaiGai Kohei #ifndef _JFFS2_FS_XATTR_H_ 13aa98d7cfSKaiGai Kohei #define _JFFS2_FS_XATTR_H_ 14aa98d7cfSKaiGai Kohei 15aa98d7cfSKaiGai Kohei #include <linux/xattr.h> 164470d040SKaiGai Kohei #include <linux/list.h> 17aa98d7cfSKaiGai Kohei 18aa98d7cfSKaiGai Kohei #define JFFS2_XFLAGS_HOT (0x01) /* This datum is HOT */ 19aa98d7cfSKaiGai Kohei #define JFFS2_XFLAGS_BIND (0x02) /* This datum is not reclaimed */ 208a13695cSKaiGai Kohei #define JFFS2_XFLAGS_DEAD (0x40) /* This datum is already dead */ 21c9f700f8SKaiGai Kohei #define JFFS2_XFLAGS_INVALID (0x80) /* This datum contains crc error */ 22aa98d7cfSKaiGai Kohei 23aa98d7cfSKaiGai Kohei struct jffs2_xattr_datum 24aa98d7cfSKaiGai Kohei { 25aa98d7cfSKaiGai Kohei void *always_null; 26aa98d7cfSKaiGai Kohei struct jffs2_raw_node_ref *node; 27987d47b7SDavid Woodhouse uint8_t class; 28987d47b7SDavid Woodhouse uint8_t flags; 29987d47b7SDavid Woodhouse uint16_t xprefix; /* see JFFS2_XATTR_PREFIX_* */ 30987d47b7SDavid Woodhouse 31aa98d7cfSKaiGai Kohei struct list_head xindex; /* chained from c->xattrindex[n] */ 322c887e23SKaiGai Kohei atomic_t refcnt; /* # of xattr_ref refers this */ 33aa98d7cfSKaiGai Kohei uint32_t xid; 34aa98d7cfSKaiGai Kohei uint32_t version; 35aa98d7cfSKaiGai Kohei 36aa98d7cfSKaiGai Kohei uint32_t data_crc; 37aa98d7cfSKaiGai Kohei uint32_t hashkey; 38aa98d7cfSKaiGai Kohei char *xname; /* XATTR name without prefix */ 39aa98d7cfSKaiGai Kohei uint32_t name_len; /* length of xname */ 40aa98d7cfSKaiGai Kohei char *xvalue; /* XATTR value */ 41aa98d7cfSKaiGai Kohei uint32_t value_len; /* length of xvalue */ 42aa98d7cfSKaiGai Kohei }; 43aa98d7cfSKaiGai Kohei 44ee886b5dSKaiGai Kohei struct jffs2_inode_cache; 45aa98d7cfSKaiGai Kohei struct jffs2_xattr_ref 46aa98d7cfSKaiGai Kohei { 47aa98d7cfSKaiGai Kohei void *always_null; 48987d47b7SDavid Woodhouse struct jffs2_raw_node_ref *node; 49987d47b7SDavid Woodhouse uint8_t class; 50987d47b7SDavid Woodhouse uint8_t flags; /* Currently unused */ 51aa98d7cfSKaiGai Kohei u16 unused; 52aa98d7cfSKaiGai Kohei 53c9f700f8SKaiGai Kohei uint32_t xseqno; 54aa98d7cfSKaiGai Kohei union { 55aa98d7cfSKaiGai Kohei struct jffs2_inode_cache *ic; /* reference to jffs2_inode_cache */ 56aa98d7cfSKaiGai Kohei uint32_t ino; /* only used in scanning/building */ 57aa98d7cfSKaiGai Kohei }; 58aa98d7cfSKaiGai Kohei union { 59aa98d7cfSKaiGai Kohei struct jffs2_xattr_datum *xd; /* reference to jffs2_xattr_datum */ 60aa98d7cfSKaiGai Kohei uint32_t xid; /* only used in sccanning/building */ 61aa98d7cfSKaiGai Kohei }; 628f2b6f49SKaiGai Kohei struct jffs2_xattr_ref *next; /* chained from ic->xref_list */ 63aa98d7cfSKaiGai Kohei }; 64aa98d7cfSKaiGai Kohei 65c9f700f8SKaiGai Kohei #define XREF_DELETE_MARKER (0x00000001) 66c9f700f8SKaiGai Kohei static inline int is_xattr_ref_dead(struct jffs2_xattr_ref *ref) 67c9f700f8SKaiGai Kohei { 68c9f700f8SKaiGai Kohei return ((ref->xseqno & XREF_DELETE_MARKER) != 0); 69c9f700f8SKaiGai Kohei } 70c9f700f8SKaiGai Kohei 71aa98d7cfSKaiGai Kohei #ifdef CONFIG_JFFS2_FS_XATTR 72aa98d7cfSKaiGai Kohei 73aa98d7cfSKaiGai Kohei extern void jffs2_init_xattr_subsystem(struct jffs2_sb_info *c); 74aa98d7cfSKaiGai Kohei extern void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c); 75aa98d7cfSKaiGai Kohei extern void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c); 76aa98d7cfSKaiGai Kohei 77aa98d7cfSKaiGai Kohei extern struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c, 78aa98d7cfSKaiGai Kohei uint32_t xid, uint32_t version); 79aa98d7cfSKaiGai Kohei 80aa98d7cfSKaiGai Kohei extern void jffs2_xattr_delete_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic); 81aa98d7cfSKaiGai Kohei extern void jffs2_xattr_free_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic); 82aa98d7cfSKaiGai Kohei 83c9f700f8SKaiGai Kohei extern int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd, 84c9f700f8SKaiGai Kohei struct jffs2_raw_node_ref *raw); 85c9f700f8SKaiGai Kohei extern int jffs2_garbage_collect_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref, 86c9f700f8SKaiGai Kohei struct jffs2_raw_node_ref *raw); 87aa98d7cfSKaiGai Kohei extern int jffs2_verify_xattr(struct jffs2_sb_info *c); 88c9f700f8SKaiGai Kohei extern void jffs2_release_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd); 89c9f700f8SKaiGai Kohei extern void jffs2_release_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref); 90aa98d7cfSKaiGai Kohei 91aa98d7cfSKaiGai Kohei extern int do_jffs2_getxattr(struct inode *inode, int xprefix, const char *xname, 92aa98d7cfSKaiGai Kohei char *buffer, size_t size); 93aa98d7cfSKaiGai Kohei extern int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname, 94aa98d7cfSKaiGai Kohei const char *buffer, size_t size, int flags); 95aa98d7cfSKaiGai Kohei 96365f0cb9SStephen Hemminger extern const struct xattr_handler *jffs2_xattr_handlers[]; 97365f0cb9SStephen Hemminger extern const struct xattr_handler jffs2_user_xattr_handler; 98365f0cb9SStephen Hemminger extern const struct xattr_handler jffs2_trusted_xattr_handler; 99aa98d7cfSKaiGai Kohei 100aa98d7cfSKaiGai Kohei extern ssize_t jffs2_listxattr(struct dentry *, char *, size_t); 101aa98d7cfSKaiGai Kohei #define jffs2_getxattr generic_getxattr 102aa98d7cfSKaiGai Kohei #define jffs2_setxattr generic_setxattr 103aa98d7cfSKaiGai Kohei #define jffs2_removexattr generic_removexattr 104aa98d7cfSKaiGai Kohei 105aa98d7cfSKaiGai Kohei #else 106aa98d7cfSKaiGai Kohei 107aa98d7cfSKaiGai Kohei #define jffs2_init_xattr_subsystem(c) 108aa98d7cfSKaiGai Kohei #define jffs2_build_xattr_subsystem(c) 109aa98d7cfSKaiGai Kohei #define jffs2_clear_xattr_subsystem(c) 110aa98d7cfSKaiGai Kohei 111aa98d7cfSKaiGai Kohei #define jffs2_xattr_delete_inode(c, ic) 112aa98d7cfSKaiGai Kohei #define jffs2_xattr_free_inode(c, ic) 113aa98d7cfSKaiGai Kohei #define jffs2_verify_xattr(c) (1) 114aa98d7cfSKaiGai Kohei 115aa98d7cfSKaiGai Kohei #define jffs2_xattr_handlers NULL 116aa98d7cfSKaiGai Kohei #define jffs2_listxattr NULL 117aa98d7cfSKaiGai Kohei #define jffs2_getxattr NULL 118aa98d7cfSKaiGai Kohei #define jffs2_setxattr NULL 119aa98d7cfSKaiGai Kohei #define jffs2_removexattr NULL 120aa98d7cfSKaiGai Kohei 121aa98d7cfSKaiGai Kohei #endif /* CONFIG_JFFS2_FS_XATTR */ 122aa98d7cfSKaiGai Kohei 123aa98d7cfSKaiGai Kohei #ifdef CONFIG_JFFS2_FS_SECURITY 1242a7dba39SEric Paris extern int jffs2_init_security(struct inode *inode, struct inode *dir, 1252a7dba39SEric Paris const struct qstr *qstr); 126365f0cb9SStephen Hemminger extern const struct xattr_handler jffs2_security_xattr_handler; 127aa98d7cfSKaiGai Kohei #else 1282a7dba39SEric Paris #define jffs2_init_security(inode,dir,qstr) (0) 129aa98d7cfSKaiGai Kohei #endif /* CONFIG_JFFS2_FS_SECURITY */ 130aa98d7cfSKaiGai Kohei 131aa98d7cfSKaiGai Kohei #endif /* _JFFS2_FS_XATTR_H_ */ 132