]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libxfs/xfs_attr.h
libxfs: refactor manage_zones()
[thirdparty/xfsprogs-dev.git] / libxfs / xfs_attr.h
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
5 */
6 #ifndef __XFS_ATTR_H__
7 #define __XFS_ATTR_H__
8
9 struct xfs_inode;
10 struct xfs_da_args;
11 struct xfs_attr_list_context;
12
13 /*
14 * Large attribute lists are structured around Btrees where all the data
15 * elements are in the leaf nodes. Attribute names are hashed into an int,
16 * then that int is used as the index into the Btree. Since the hashval
17 * of an attribute name may not be unique, we may have duplicate keys.
18 * The internal links in the Btree are logical block offsets into the file.
19 *
20 * Small attribute lists use a different format and are packed as tightly
21 * as possible so as to fit into the literal area of the inode.
22 */
23
24 /*========================================================================
25 * External interfaces
26 *========================================================================*/
27
28
29 #define ATTR_DONTFOLLOW 0x0001 /* -- unused, from IRIX -- */
30 #define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */
31 #define ATTR_TRUST 0x0004 /* -- unused, from IRIX -- */
32 #define ATTR_SECURE 0x0008 /* use attrs in security namespace */
33 #define ATTR_CREATE 0x0010 /* pure create: fail if attr already exists */
34 #define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */
35
36 #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */
37 #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */
38
39 #define ATTR_INCOMPLETE 0x4000 /* [kernel] return INCOMPLETE attr keys */
40
41 #define XFS_ATTR_FLAGS \
42 { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \
43 { ATTR_ROOT, "ROOT" }, \
44 { ATTR_TRUST, "TRUST" }, \
45 { ATTR_SECURE, "SECURE" }, \
46 { ATTR_CREATE, "CREATE" }, \
47 { ATTR_REPLACE, "REPLACE" }, \
48 { ATTR_KERNOTIME, "KERNOTIME" }, \
49 { ATTR_KERNOVAL, "KERNOVAL" }, \
50 { ATTR_INCOMPLETE, "INCOMPLETE" }
51
52 /*
53 * The maximum size (into the kernel or returned from the kernel) of an
54 * attribute value or the buffer used for an attr_list() call. Larger
55 * sizes will result in an ERANGE return code.
56 */
57 #define ATTR_MAX_VALUELEN (64*1024) /* max length of a value */
58
59 /*
60 * Define how lists of attribute names are returned to the user from
61 * the attr_list() call. A large, 32bit aligned, buffer is passed in
62 * along with its size. We put an array of offsets at the top that each
63 * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
64 */
65 typedef struct attrlist {
66 __s32 al_count; /* number of entries in attrlist */
67 __s32 al_more; /* T/F: more attrs (do call again) */
68 __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */
69 } attrlist_t;
70
71 /*
72 * Show the interesting info about one attribute. This is what the
73 * al_offset[i] entry points to.
74 */
75 typedef struct attrlist_ent { /* data from attr_list() */
76 __u32 a_valuelen; /* number bytes in value of attr */
77 char a_name[1]; /* attr name (NULL terminated) */
78 } attrlist_ent_t;
79
80 /*
81 * Given a pointer to the (char*) buffer containing the attr_list() result,
82 * and an index, return a pointer to the indicated attribute in the buffer.
83 */
84 #define ATTR_ENTRY(buffer, index) \
85 ((attrlist_ent_t *) \
86 &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ])
87
88 /*
89 * Kernel-internal version of the attrlist cursor.
90 */
91 typedef struct attrlist_cursor_kern {
92 __u32 hashval; /* hash value of next entry to add */
93 __u32 blkno; /* block containing entry (suggestion) */
94 __u32 offset; /* offset in list of equal-hashvals */
95 __u16 pad1; /* padding to match user-level */
96 __u8 pad2; /* padding to match user-level */
97 __u8 initted; /* T/F: cursor has been initialized */
98 } attrlist_cursor_kern_t;
99
100
101 /*========================================================================
102 * Structure used to pass context around among the routines.
103 *========================================================================*/
104
105
106 /* void; state communicated via *context */
107 typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
108 unsigned char *, int, int);
109
110 typedef struct xfs_attr_list_context {
111 struct xfs_trans *tp;
112 struct xfs_inode *dp; /* inode */
113 struct attrlist_cursor_kern *cursor; /* position in list */
114 char *alist; /* output buffer */
115 int seen_enough; /* T/F: seen enough of list? */
116 ssize_t count; /* num used entries */
117 int dupcnt; /* count dup hashvals seen */
118 int bufsize; /* total buffer size */
119 int firstu; /* first used byte in buffer */
120 int flags; /* from VOP call */
121 int resynch; /* T/F: resynch with cursor */
122 put_listent_func_t put_listent; /* list output fmt function */
123 int index; /* index into output buffer */
124 } xfs_attr_list_context_t;
125
126
127 /*========================================================================
128 * Function prototypes for the kernel.
129 *========================================================================*/
130
131 /*
132 * Overall external interface routines.
133 */
134 int xfs_attr_inactive(struct xfs_inode *dp);
135 int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *);
136 int xfs_attr_list_int(struct xfs_attr_list_context *);
137 int xfs_inode_hasattr(struct xfs_inode *ip);
138 int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args);
139 int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name,
140 unsigned char *value, int *valuelenp, int flags);
141 int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name,
142 unsigned char *value, int valuelen, int flags);
143 int xfs_attr_set_args(struct xfs_da_args *args, struct xfs_buf **leaf_bp);
144 int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags);
145 int xfs_attr_remove_args(struct xfs_da_args *args);
146 int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
147 int flags, struct attrlist_cursor_kern *cursor);
148
149
150 #endif /* __XFS_ATTR_H__ */