Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
[linux-2.6] / fs / jffs2 / xattr.h
1 /*
2  * JFFS2 -- Journalling Flash File System, Version 2.
3  *
4  * Copyright (C) 2006  NEC Corporation
5  *
6  * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
7  *
8  * For licensing information, see the file 'LICENCE' in this directory.
9  *
10  */
11 #ifndef _JFFS2_FS_XATTR_H_
12 #define _JFFS2_FS_XATTR_H_
13
14 #include <linux/xattr.h>
15 #include <linux/list.h>
16
17 #define JFFS2_XFLAGS_HOT        (0x01)  /* This datum is HOT */
18 #define JFFS2_XFLAGS_BIND       (0x02)  /* This datum is not reclaimed */
19 #define JFFS2_XFLAGS_DEAD       (0x40)  /* This datum is already dead */
20 #define JFFS2_XFLAGS_INVALID    (0x80)  /* This datum contains crc error */
21
22 struct jffs2_xattr_datum
23 {
24         void *always_null;
25         struct jffs2_raw_node_ref *node;
26         uint8_t class;
27         uint8_t flags;
28         uint16_t xprefix;               /* see JFFS2_XATTR_PREFIX_* */
29
30         struct list_head xindex;        /* chained from c->xattrindex[n] */
31         atomic_t refcnt;                /* # of xattr_ref refers this */
32         uint32_t xid;
33         uint32_t version;
34
35         uint32_t data_crc;
36         uint32_t hashkey;
37         char *xname;            /* XATTR name without prefix */
38         uint32_t name_len;      /* length of xname */
39         char *xvalue;           /* XATTR value */
40         uint32_t value_len;     /* length of xvalue */
41 };
42
43 struct jffs2_inode_cache;
44 struct jffs2_xattr_ref
45 {
46         void *always_null;
47         struct jffs2_raw_node_ref *node;
48         uint8_t class;
49         uint8_t flags;          /* Currently unused */
50         u16 unused;
51
52         uint32_t xseqno;
53         union {
54                 struct jffs2_inode_cache *ic;   /* reference to jffs2_inode_cache */
55                 uint32_t ino;                   /* only used in scanning/building  */
56         };
57         union {
58                 struct jffs2_xattr_datum *xd;   /* reference to jffs2_xattr_datum */
59                 uint32_t xid;                   /* only used in sccanning/building */
60         };
61         struct jffs2_xattr_ref *next;           /* chained from ic->xref_list */
62 };
63
64 #define XREF_DELETE_MARKER      (0x00000001)
65 static inline int is_xattr_ref_dead(struct jffs2_xattr_ref *ref)
66 {
67         return ((ref->xseqno & XREF_DELETE_MARKER) != 0);
68 }
69
70 #ifdef CONFIG_JFFS2_FS_XATTR
71
72 extern void jffs2_init_xattr_subsystem(struct jffs2_sb_info *c);
73 extern void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c);
74 extern void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c);
75
76 extern struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c,
77                                                   uint32_t xid, uint32_t version);
78
79 extern void jffs2_xattr_delete_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic);
80 extern void jffs2_xattr_free_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic);
81
82 extern int jffs2_garbage_collect_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd,
83                                              struct jffs2_raw_node_ref *raw);
84 extern int jffs2_garbage_collect_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref,
85                                            struct jffs2_raw_node_ref *raw);
86 extern int jffs2_verify_xattr(struct jffs2_sb_info *c);
87 extern void jffs2_release_xattr_datum(struct jffs2_sb_info *c, struct jffs2_xattr_datum *xd);
88 extern void jffs2_release_xattr_ref(struct jffs2_sb_info *c, struct jffs2_xattr_ref *ref);
89
90 extern int do_jffs2_getxattr(struct inode *inode, int xprefix, const char *xname,
91                              char *buffer, size_t size);
92 extern int do_jffs2_setxattr(struct inode *inode, int xprefix, const char *xname,
93                              const char *buffer, size_t size, int flags);
94
95 extern struct xattr_handler *jffs2_xattr_handlers[];
96 extern struct xattr_handler jffs2_user_xattr_handler;
97 extern struct xattr_handler jffs2_trusted_xattr_handler;
98
99 extern ssize_t jffs2_listxattr(struct dentry *, char *, size_t);
100 #define jffs2_getxattr          generic_getxattr
101 #define jffs2_setxattr          generic_setxattr
102 #define jffs2_removexattr       generic_removexattr
103
104 #else
105
106 #define jffs2_init_xattr_subsystem(c)
107 #define jffs2_build_xattr_subsystem(c)
108 #define jffs2_clear_xattr_subsystem(c)
109
110 #define jffs2_xattr_delete_inode(c, ic)
111 #define jffs2_xattr_free_inode(c, ic)
112 #define jffs2_verify_xattr(c)                   (1)
113
114 #define jffs2_xattr_handlers    NULL
115 #define jffs2_listxattr         NULL
116 #define jffs2_getxattr          NULL
117 #define jffs2_setxattr          NULL
118 #define jffs2_removexattr       NULL
119
120 #endif /* CONFIG_JFFS2_FS_XATTR */
121
122 #ifdef CONFIG_JFFS2_FS_SECURITY
123 extern int jffs2_init_security(struct inode *inode, struct inode *dir);
124 extern struct xattr_handler jffs2_security_xattr_handler;
125 #else
126 #define jffs2_init_security(inode,dir)  (0)
127 #endif /* CONFIG_JFFS2_FS_SECURITY */
128
129 #endif /* _JFFS2_FS_XATTR_H_ */