Linux-2.6.12-rc2
[linux-flexiantxendom0-natty.git] / fs / xfs / xfs_attr.h
1 /*
2  * Copyright (c) 2000, 2002-2003 Silicon Graphics, Inc.  All Rights Reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it would be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  *
12  * Further, this software is distributed without any warranty that it is
13  * free of the rightful claim of any third person regarding infringement
14  * or the like.  Any license provided herein, whether implied or
15  * otherwise, applies only to this software file.  Patent licenses, if
16  * any, provided herein do not apply to combinations of this program with
17  * other software, or any other product whatsoever.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write the Free Software Foundation, Inc., 59
21  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22  *
23  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24  * Mountain View, CA  94043, or:
25  *
26  * http://www.sgi.com
27  *
28  * For further information regarding this notice, see:
29  *
30  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31  */
32 #ifndef __XFS_ATTR_H__
33 #define __XFS_ATTR_H__
34
35 /*
36  * xfs_attr.h
37  *
38  * Large attribute lists are structured around Btrees where all the data
39  * elements are in the leaf nodes.  Attribute names are hashed into an int,
40  * then that int is used as the index into the Btree.  Since the hashval
41  * of an attribute name may not be unique, we may have duplicate keys.
42  * The internal links in the Btree are logical block offsets into the file.
43  *
44  * Small attribute lists use a different format and are packed as tightly
45  * as possible so as to fit into the literal area of the inode.
46  */
47
48 /*========================================================================
49  * External interfaces
50  *========================================================================*/
51
52 struct cred;
53 struct vnode;
54
55 typedef int (*attrset_t)(struct vnode *, char *, void *, size_t, int);
56 typedef int (*attrget_t)(struct vnode *, char *, void *, size_t, int);
57 typedef int (*attrremove_t)(struct vnode *, char *, int);
58 typedef int (*attrexists_t)(struct vnode *);
59 typedef int (*attrcapable_t)(struct vnode *, struct cred *);
60
61 typedef struct attrnames {
62         char *          attr_name;
63         unsigned int    attr_namelen;
64         unsigned int    attr_flag;
65         attrget_t       attr_get;
66         attrset_t       attr_set;
67         attrremove_t    attr_remove;
68         attrexists_t    attr_exists;
69         attrcapable_t   attr_capable;
70 } attrnames_t;
71
72 #define ATTR_NAMECOUNT  4
73 extern struct attrnames attr_user;
74 extern struct attrnames attr_secure;
75 extern struct attrnames attr_system;
76 extern struct attrnames attr_trusted;
77 extern struct attrnames *attr_namespaces[ATTR_NAMECOUNT];
78
79 #define ATTR_SYSCOUNT   2
80 extern struct attrnames posix_acl_access;
81 extern struct attrnames posix_acl_default;
82 extern struct attrnames *attr_system_names[ATTR_SYSCOUNT];
83
84 extern attrnames_t *attr_lookup_namespace(char *, attrnames_t **, int);
85 extern int attr_generic_list(struct vnode *, void *, size_t, int, ssize_t *);
86
87 #define ATTR_DONTFOLLOW 0x0001  /* -- unused, from IRIX -- */
88 #define ATTR_ROOT       0x0002  /* use attrs in root (trusted) namespace */
89 #define ATTR_TRUST      0x0004  /* -- unused, from IRIX -- */
90 #define ATTR_SECURE     0x0008  /* use attrs in security namespace */
91 #define ATTR_CREATE     0x0010  /* pure create: fail if attr already exists */
92 #define ATTR_REPLACE    0x0020  /* pure set: fail if attr does not exist */
93 #define ATTR_SYSTEM     0x0100  /* use attrs in system (pseudo) namespace */
94
95 #define ATTR_KERNACCESS 0x0400  /* [kernel] iaccess, inode held io-locked */
96 #define ATTR_KERNOTIME  0x1000  /* [kernel] don't update inode timestamps */
97 #define ATTR_KERNOVAL   0x2000  /* [kernel] get attr size only, not value */
98 #define ATTR_KERNAMELS  0x4000  /* [kernel] list attr names (simple list) */
99
100 #define ATTR_KERNORMALS 0x0800  /* [kernel] normal attr list: user+secure */
101 #define ATTR_KERNROOTLS 0x8000  /* [kernel] include root in the attr list */
102 #define ATTR_KERNFULLS  (ATTR_KERNORMALS|ATTR_KERNROOTLS)
103
104 /*
105  * The maximum size (into the kernel or returned from the kernel) of an
106  * attribute value or the buffer used for an attr_list() call.  Larger
107  * sizes will result in an ERANGE return code.
108  */
109 #define ATTR_MAX_VALUELEN       (64*1024)       /* max length of a value */
110
111 /*
112  * Define how lists of attribute names are returned to the user from
113  * the attr_list() call.  A large, 32bit aligned, buffer is passed in
114  * along with its size.  We put an array of offsets at the top that each
115  * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
116  */
117 typedef struct attrlist {
118         __s32   al_count;       /* number of entries in attrlist */
119         __s32   al_more;        /* T/F: more attrs (do call again) */
120         __s32   al_offset[1];   /* byte offsets of attrs [var-sized] */
121 } attrlist_t;
122
123 /*
124  * Show the interesting info about one attribute.  This is what the
125  * al_offset[i] entry points to.
126  */
127 typedef struct attrlist_ent {   /* data from attr_list() */
128         __u32   a_valuelen;     /* number bytes in value of attr */
129         char    a_name[1];      /* attr name (NULL terminated) */
130 } attrlist_ent_t;
131
132 /*
133  * Given a pointer to the (char*) buffer containing the attr_list() result,
134  * and an index, return a pointer to the indicated attribute in the buffer.
135  */
136 #define ATTR_ENTRY(buffer, index)               \
137         ((attrlist_ent_t *)                     \
138          &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ])
139
140 /*
141  * Multi-attribute operation vector.
142  */
143 typedef struct attr_multiop {
144         int     am_opcode;      /* operation to perform (ATTR_OP_GET, etc.) */
145         int     am_error;       /* [out arg] result of this sub-op (an errno) */
146         char    *am_attrname;   /* attribute name to work with */
147         char    *am_attrvalue;  /* [in/out arg] attribute value (raw bytes) */
148         int     am_length;      /* [in/out arg] length of value */
149         int     am_flags;       /* bitwise OR of attr API flags defined above */
150 } attr_multiop_t;
151
152 #define ATTR_OP_GET     1       /* return the indicated attr's value */
153 #define ATTR_OP_SET     2       /* set/create the indicated attr/value pair */
154 #define ATTR_OP_REMOVE  3       /* remove the indicated attr */
155
156 /*
157  * Kernel-internal version of the attrlist cursor.
158  */
159 typedef struct attrlist_cursor_kern {
160         __u32   hashval;        /* hash value of next entry to add */
161         __u32   blkno;          /* block containing entry (suggestion) */
162         __u32   offset;         /* offset in list of equal-hashvals */
163         __u16   pad1;           /* padding to match user-level */
164         __u8    pad2;           /* padding to match user-level */
165         __u8    initted;        /* T/F: cursor has been initialized */
166 } attrlist_cursor_kern_t;
167
168
169 /*========================================================================
170  * Function prototypes for the kernel.
171  *========================================================================*/
172
173 struct xfs_inode;
174 struct attrlist_cursor_kern;
175 struct xfs_da_args;
176
177 /*
178  * Overall external interface routines.
179  */
180 int xfs_attr_get(bhv_desc_t *, char *, char *, int *, int, struct cred *);
181 int xfs_attr_set(bhv_desc_t *, char *, char *, int, int, struct cred *);
182 int xfs_attr_remove(bhv_desc_t *, char *, int, struct cred *);
183 int xfs_attr_list(bhv_desc_t *, char *, int, int,
184                          struct attrlist_cursor_kern *, struct cred *);
185 int xfs_attr_inactive(struct xfs_inode *dp);
186
187 int xfs_attr_node_get(struct xfs_da_args *);
188 int xfs_attr_leaf_get(struct xfs_da_args *);
189 int xfs_attr_shortform_getvalue(struct xfs_da_args *);
190 int xfs_attr_fetch(struct xfs_inode *, char *, int,
191                         char *, int *, int, struct cred *);
192
193 #endif  /* __XFS_ATTR_H__ */