blob: 0c8f7c7a6b65b54d1815bc1662836f59698217c9 [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
Christoph Hellwig953aa9d2020-01-07 15:25:37 -080029#define ATTR_DONTFOLLOW 0x0001 /* -- ignored, from IRIX -- */
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#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
Christoph Hellwig0b1b2132009-12-14 23:14:59 +000036#define XFS_ATTR_FLAGS \
37 { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \
38 { ATTR_ROOT, "ROOT" }, \
39 { ATTR_TRUST, "TRUST" }, \
40 { ATTR_SECURE, "SECURE" }, \
41 { ATTR_CREATE, "CREATE" }, \
Christoph Hellwig1d733012020-02-26 17:30:36 -080042 { ATTR_REPLACE, "REPLACE" }
Christoph Hellwig0b1b2132009-12-14 23:14:59 +000043
Linus Torvalds1da177e2005-04-16 15:20:36 -070044/*
45 * The maximum size (into the kernel or returned from the kernel) of an
46 * attribute value or the buffer used for an attr_list() call. Larger
47 * sizes will result in an ERANGE return code.
48 */
49#define ATTR_MAX_VALUELEN (64*1024) /* max length of a value */
50
51/*
52 * Define how lists of attribute names are returned to the user from
53 * the attr_list() call. A large, 32bit aligned, buffer is passed in
54 * along with its size. We put an array of offsets at the top that each
55 * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
56 */
57typedef struct attrlist {
58 __s32 al_count; /* number of entries in attrlist */
59 __s32 al_more; /* T/F: more attrs (do call again) */
60 __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */
61} attrlist_t;
62
63/*
64 * Show the interesting info about one attribute. This is what the
65 * al_offset[i] entry points to.
66 */
67typedef struct attrlist_ent { /* data from attr_list() */
68 __u32 a_valuelen; /* number bytes in value of attr */
69 char a_name[1]; /* attr name (NULL terminated) */
70} attrlist_ent_t;
71
72/*
73 * Given a pointer to the (char*) buffer containing the attr_list() result,
74 * and an index, return a pointer to the indicated attribute in the buffer.
75 */
76#define ATTR_ENTRY(buffer, index) \
77 ((attrlist_ent_t *) \
78 &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ])
79
80/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070081 * Kernel-internal version of the attrlist cursor.
82 */
83typedef struct attrlist_cursor_kern {
84 __u32 hashval; /* hash value of next entry to add */
85 __u32 blkno; /* block containing entry (suggestion) */
86 __u32 offset; /* offset in list of equal-hashvals */
87 __u16 pad1; /* padding to match user-level */
88 __u8 pad2; /* padding to match user-level */
89 __u8 initted; /* T/F: cursor has been initialized */
90} attrlist_cursor_kern_t;
91
92
93/*========================================================================
Christoph Hellwigad9b4632008-06-23 13:23:48 +100094 * Structure used to pass context around among the routines.
Linus Torvalds1da177e2005-04-16 15:20:36 -070095 *========================================================================*/
96
Christoph Hellwigad9b4632008-06-23 13:23:48 +100097
Eric Sandeenf7a136a2016-12-05 12:32:14 +110098/* void; state communicated via *context */
99typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
Eric Sandeene5bd12b2016-04-06 07:57:32 +1000100 unsigned char *, int, int);
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000101
Christoph Hellwiga9c8c692020-02-26 17:30:37 -0800102struct xfs_attr_list_context {
103 struct xfs_trans *tp;
104 struct xfs_inode *dp; /* inode */
105 struct attrlist_cursor_kern *cursor; /* position in list */
106 void *buffer; /* output buffer */
Darrick J. Wong2c3b83d2019-07-05 10:29:54 -0700107
108 /*
109 * Abort attribute list iteration if non-zero. Can be used to pass
110 * error values to the xfs_attr_list caller.
111 */
Christoph Hellwiga9c8c692020-02-26 17:30:37 -0800112 int seen_enough;
113 bool allow_incomplete;
Darrick J. Wong2c3b83d2019-07-05 10:29:54 -0700114
Christoph Hellwiga9c8c692020-02-26 17:30:37 -0800115 ssize_t count; /* num used entries */
116 int dupcnt; /* count dup hashvals seen */
117 int bufsize; /* total buffer size */
118 int firstu; /* first used byte in buffer */
119 int flags; /* from VOP call */
120 int resynch; /* T/F: resynch with cursor */
121 put_listent_func_t put_listent; /* list output fmt function */
122 int index; /* index into output buffer */
123};
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000124
125
126/*========================================================================
127 * Function prototypes for the kernel.
128 *========================================================================*/
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129
130/*
131 * Overall external interface routines.
132 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133int xfs_attr_inactive(struct xfs_inode *dp);
Darrick J. Wongad017f62017-06-16 11:00:14 -0700134int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *);
Christoph Hellwigad9b4632008-06-23 13:23:48 +1000135int xfs_attr_list_int(struct xfs_attr_list_context *);
Dave Chinnerabec5f22013-08-12 20:49:38 +1000136int xfs_inode_hasattr(struct xfs_inode *ip);
Christoph Hellwigc36f5332020-02-26 17:30:34 -0800137int xfs_attr_get_ilocked(struct xfs_da_args *args);
Christoph Hellwige5171d72020-02-26 17:30:34 -0800138int xfs_attr_get(struct xfs_da_args *args);
Christoph Hellwiga2544622020-02-26 17:30:33 -0800139int xfs_attr_set(struct xfs_da_args *args);
Darrick J. Wong710d7072019-04-24 09:27:41 -0700140int xfs_attr_set_args(struct xfs_da_args *args);
Allison Henderson068f9852018-10-18 17:21:23 +1100141int xfs_attr_remove_args(struct xfs_da_args *args);
Dave Chinnerc24b5df2013-08-12 20:49:45 +1000142int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
143 int flags, struct attrlist_cursor_kern *cursor);
Darrick J. Wong65480532019-02-01 09:08:54 -0800144bool xfs_attr_namecheck(const void *name, size_t length);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145
146#endif /* __XFS_ATTR_H__ */