Root/
1 | /* |
2 | * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc. |
3 | * All Rights Reserved. |
4 | * |
5 | * This program is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU General Public License as |
7 | * published by the Free Software Foundation. |
8 | * |
9 | * This program is distributed in the hope that it would be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | * GNU General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU General Public License |
15 | * along with this program; if not, write the Free Software Foundation, |
16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
17 | */ |
18 | #ifndef __XFS_ATTR_H__ |
19 | #define __XFS_ATTR_H__ |
20 | |
21 | struct xfs_inode; |
22 | struct xfs_da_args; |
23 | struct xfs_attr_list_context; |
24 | |
25 | /* |
26 | * Large attribute lists are structured around Btrees where all the data |
27 | * elements are in the leaf nodes. Attribute names are hashed into an int, |
28 | * then that int is used as the index into the Btree. Since the hashval |
29 | * of an attribute name may not be unique, we may have duplicate keys. |
30 | * The internal links in the Btree are logical block offsets into the file. |
31 | * |
32 | * Small attribute lists use a different format and are packed as tightly |
33 | * as possible so as to fit into the literal area of the inode. |
34 | */ |
35 | |
36 | /*======================================================================== |
37 | * External interfaces |
38 | *========================================================================*/ |
39 | |
40 | |
41 | #define ATTR_DONTFOLLOW 0x0001 /* -- unused, from IRIX -- */ |
42 | #define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */ |
43 | #define ATTR_TRUST 0x0004 /* -- unused, from IRIX -- */ |
44 | #define ATTR_SECURE 0x0008 /* use attrs in security namespace */ |
45 | #define ATTR_CREATE 0x0010 /* pure create: fail if attr already exists */ |
46 | #define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */ |
47 | |
48 | #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */ |
49 | #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */ |
50 | |
51 | #define XFS_ATTR_FLAGS \ |
52 | { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \ |
53 | { ATTR_ROOT, "ROOT" }, \ |
54 | { ATTR_TRUST, "TRUST" }, \ |
55 | { ATTR_SECURE, "SECURE" }, \ |
56 | { ATTR_CREATE, "CREATE" }, \ |
57 | { ATTR_REPLACE, "REPLACE" }, \ |
58 | { ATTR_KERNOTIME, "KERNOTIME" }, \ |
59 | { ATTR_KERNOVAL, "KERNOVAL" } |
60 | |
61 | /* |
62 | * The maximum size (into the kernel or returned from the kernel) of an |
63 | * attribute value or the buffer used for an attr_list() call. Larger |
64 | * sizes will result in an ERANGE return code. |
65 | */ |
66 | #define ATTR_MAX_VALUELEN (64*1024) /* max length of a value */ |
67 | |
68 | /* |
69 | * Define how lists of attribute names are returned to the user from |
70 | * the attr_list() call. A large, 32bit aligned, buffer is passed in |
71 | * along with its size. We put an array of offsets at the top that each |
72 | * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom. |
73 | */ |
74 | typedef struct attrlist { |
75 | __s32 al_count; /* number of entries in attrlist */ |
76 | __s32 al_more; /* T/F: more attrs (do call again) */ |
77 | __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */ |
78 | } attrlist_t; |
79 | |
80 | /* |
81 | * Show the interesting info about one attribute. This is what the |
82 | * al_offset[i] entry points to. |
83 | */ |
84 | typedef struct attrlist_ent { /* data from attr_list() */ |
85 | __u32 a_valuelen; /* number bytes in value of attr */ |
86 | char a_name[1]; /* attr name (NULL terminated) */ |
87 | } attrlist_ent_t; |
88 | |
89 | /* |
90 | * Given a pointer to the (char*) buffer containing the attr_list() result, |
91 | * and an index, return a pointer to the indicated attribute in the buffer. |
92 | */ |
93 | #define ATTR_ENTRY(buffer, index) \ |
94 | ((attrlist_ent_t *) \ |
95 | &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ]) |
96 | |
97 | /* |
98 | * Kernel-internal version of the attrlist cursor. |
99 | */ |
100 | typedef struct attrlist_cursor_kern { |
101 | __u32 hashval; /* hash value of next entry to add */ |
102 | __u32 blkno; /* block containing entry (suggestion) */ |
103 | __u32 offset; /* offset in list of equal-hashvals */ |
104 | __u16 pad1; /* padding to match user-level */ |
105 | __u8 pad2; /* padding to match user-level */ |
106 | __u8 initted; /* T/F: cursor has been initialized */ |
107 | } attrlist_cursor_kern_t; |
108 | |
109 | |
110 | /*======================================================================== |
111 | * Structure used to pass context around among the routines. |
112 | *========================================================================*/ |
113 | |
114 | |
115 | typedef int (*put_listent_func_t)(struct xfs_attr_list_context *, int, |
116 | unsigned char *, int, int, unsigned char *); |
117 | |
118 | typedef struct xfs_attr_list_context { |
119 | struct xfs_inode *dp; /* inode */ |
120 | struct attrlist_cursor_kern *cursor; /* position in list */ |
121 | char *alist; /* output buffer */ |
122 | int seen_enough; /* T/F: seen enough of list? */ |
123 | ssize_t count; /* num used entries */ |
124 | int dupcnt; /* count dup hashvals seen */ |
125 | int bufsize; /* total buffer size */ |
126 | int firstu; /* first used byte in buffer */ |
127 | int flags; /* from VOP call */ |
128 | int resynch; /* T/F: resynch with cursor */ |
129 | int put_value; /* T/F: need value for listent */ |
130 | put_listent_func_t put_listent; /* list output fmt function */ |
131 | int index; /* index into output buffer */ |
132 | } xfs_attr_list_context_t; |
133 | |
134 | |
135 | /*======================================================================== |
136 | * Function prototypes for the kernel. |
137 | *========================================================================*/ |
138 | |
139 | /* |
140 | * Overall external interface routines. |
141 | */ |
142 | int xfs_attr_inactive(struct xfs_inode *dp); |
143 | int xfs_attr_rmtval_get(struct xfs_da_args *args); |
144 | int xfs_attr_list_int(struct xfs_attr_list_context *); |
145 | |
146 | #endif /* __XFS_ATTR_H__ */ |
147 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9