blob: 3b0dce06e454f265eb7e97bb5712f0e10639e286 [file] [log] [blame]
Dave Chinner0b61f8a2018-06-05 19:42:14 -07001// SPDX-License-Identifier: GPL-2.0
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Nathan Scott7b718762005-11-02 14:58:39 +11003 * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 */
6#ifndef __XFS_ATTR_H__
7#define __XFS_ATTR_H__
8
Christoph Hellwigad9b4632008-06-23 13:23:48 +10009struct xfs_inode;
10struct xfs_da_args;
11struct xfs_attr_list_context;
12
Linus Torvalds1da177e2005-04-16 15:20:36 -070013/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 * 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
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
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 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */
37#define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
Darrick J. Wongeec04822017-10-17 21:37:45 -070039#define ATTR_INCOMPLETE 0x4000 /* [kernel] return INCOMPLETE attr keys */
40
Christoph Hellwig0b1b2132009-12-14 23:14:59 +000041#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" }, \
Darrick J. Wongeec04822017-10-17 21:37:45 -070049 { ATTR_KERNOVAL, "KERNOVAL" }, \
50 { ATTR_INCOMPLETE, "INCOMPLETE" }
Christoph Hellwig0b1b2132009-12-14 23:14:59 +000051
Linus Torvalds1da177e2005-04-16 15:20:36 -070052/*
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 */
65typedef 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 */
75typedef 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/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070089 * Kernel-internal version of the attrlist cursor.
90 */
91typedef 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/*========================================================================
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000102 * Structure used to pass context around among the routines.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 *========================================================================*/
104
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000105
Eric Sandeenf7a136a2016-12-05 12:32:14 +1100106/* void; state communicated via *context */
107typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
Eric Sandeene5bd12b2016-04-06 07:57:32 +1000108 unsigned char *, int, int);
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000109
110typedef struct xfs_attr_list_context {
Darrick J. Wongad017f62017-06-16 11:00:14 -0700111 struct xfs_trans *tp;
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000112 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? */
Tim Shimmin61f10fa2008-06-23 13:25:09 +1000116 ssize_t count; /* num used entries */
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000117 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 */
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000122 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 *========================================================================*/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130
131/*
132 * Overall external interface routines.
133 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134int xfs_attr_inactive(struct xfs_inode *dp);
Darrick J. Wongad017f62017-06-16 11:00:14 -0700135int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *);
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000136int xfs_attr_list_int(struct xfs_attr_list_context *);
Dave Chinnerabec5f22013-08-12 20:49:38 +1000137int xfs_inode_hasattr(struct xfs_inode *ip);
Darrick J. Wongad017f62017-06-16 11:00:14 -0700138int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args);
Dave Chinnerc24b5df2013-08-12 20:49:45 +1000139int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name,
140 unsigned char *value, int *valuelenp, int flags);
141int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name,
142 unsigned char *value, int valuelen, int flags);
Darrick J. Wong710d7072019-04-24 09:27:41 -0700143int xfs_attr_set_args(struct xfs_da_args *args);
Dave Chinnerc24b5df2013-08-12 20:49:45 +1000144int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags);
Allison Henderson068f9852018-10-18 17:21:23 +1100145int xfs_attr_remove_args(struct xfs_da_args *args);
Dave Chinnerc24b5df2013-08-12 20:49:45 +1000146int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
147 int flags, struct attrlist_cursor_kern *cursor);
Darrick J. Wong65480532019-02-01 09:08:54 -0800148bool xfs_attr_namecheck(const void *name, size_t length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149
150#endif /* __XFS_ATTR_H__ */