xfs_attr.h 4.9 KB
Newer Older
D
Dave Chinner 已提交
1
// SPDX-License-Identifier: GPL-2.0
L
Linus Torvalds 已提交
2
/*
3 4
 * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
 * All Rights Reserved.
L
Linus Torvalds 已提交
5 6 7 8
 */
#ifndef __XFS_ATTR_H__
#define	__XFS_ATTR_H__

9 10 11 12
struct xfs_inode;
struct xfs_da_args;
struct xfs_attr_list_context;

L
Linus Torvalds 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Large attribute lists are structured around Btrees where all the data
 * elements are in the leaf nodes.  Attribute names are hashed into an int,
 * then that int is used as the index into the Btree.  Since the hashval
 * of an attribute name may not be unique, we may have duplicate keys.
 * The internal links in the Btree are logical block offsets into the file.
 *
 * Small attribute lists use a different format and are packed as tightly
 * as possible so as to fit into the literal area of the inode.
 */

/*========================================================================
 * External interfaces
 *========================================================================*/


29
#define ATTR_DONTFOLLOW	0x0001	/* -- ignored, from IRIX -- */
L
Linus Torvalds 已提交
30 31 32 33 34 35
#define ATTR_ROOT	0x0002	/* use attrs in root (trusted) namespace */
#define ATTR_TRUST	0x0004	/* -- unused, from IRIX -- */
#define ATTR_SECURE	0x0008	/* use attrs in security namespace */
#define ATTR_CREATE	0x0010	/* pure create: fail if attr already exists */
#define ATTR_REPLACE	0x0020	/* pure set: fail if attr does not exist */

C
Christoph Hellwig 已提交
36 37 38 39 40 41
#define XFS_ATTR_FLAGS \
	{ ATTR_DONTFOLLOW, 	"DONTFOLLOW" }, \
	{ ATTR_ROOT,		"ROOT" }, \
	{ ATTR_TRUST,		"TRUST" }, \
	{ ATTR_SECURE,		"SECURE" }, \
	{ ATTR_CREATE,		"CREATE" }, \
42
	{ ATTR_REPLACE,		"REPLACE" }
C
Christoph Hellwig 已提交
43

L
Linus Torvalds 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
/*
 * The maximum size (into the kernel or returned from the kernel) of an
 * attribute value or the buffer used for an attr_list() call.  Larger
 * sizes will result in an ERANGE return code.
 */
#define	ATTR_MAX_VALUELEN	(64*1024)	/* max length of a value */

/*
 * Define how lists of attribute names are returned to the user from
 * the attr_list() call.  A large, 32bit aligned, buffer is passed in
 * along with its size.  We put an array of offsets at the top that each
 * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
 */
typedef struct attrlist {
	__s32	al_count;	/* number of entries in attrlist */
	__s32	al_more;	/* T/F: more attrs (do call again) */
	__s32	al_offset[1];	/* byte offsets of attrs [var-sized] */
} attrlist_t;

/*
 * Show the interesting info about one attribute.  This is what the
 * al_offset[i] entry points to.
 */
typedef struct attrlist_ent {	/* data from attr_list() */
	__u32	a_valuelen;	/* number bytes in value of attr */
	char	a_name[1];	/* attr name (NULL terminated) */
} attrlist_ent_t;

/*
 * Kernel-internal version of the attrlist cursor.
 */
typedef struct attrlist_cursor_kern {
	__u32	hashval;	/* hash value of next entry to add */
	__u32	blkno;		/* block containing entry (suggestion) */
	__u32	offset;		/* offset in list of equal-hashvals */
	__u16	pad1;		/* padding to match user-level */
	__u8	pad2;		/* padding to match user-level */
	__u8	initted;	/* T/F: cursor has been initialized */
} attrlist_cursor_kern_t;


/*========================================================================
86
 * Structure used to pass context around among the routines.
L
Linus Torvalds 已提交
87 88
 *========================================================================*/

89

90 91
/* void; state communicated via *context */
typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
92
			      unsigned char *, int, int);
93

94 95 96 97 98
struct xfs_attr_list_context {
	struct xfs_trans	*tp;
	struct xfs_inode	*dp;		/* inode */
	struct attrlist_cursor_kern *cursor;	/* position in list */
	void			*buffer;	/* output buffer */
99 100 101 102 103

	/*
	 * Abort attribute list iteration if non-zero.  Can be used to pass
	 * error values to the xfs_attr_list caller.
	 */
104 105 106 107 108 109 110 111 112 113 114 115
	int			seen_enough;
	bool			allow_incomplete;

	ssize_t			count;		/* num used entries */
	int			dupcnt;		/* count dup hashvals seen */
	int			bufsize;	/* total buffer size */
	int			firstu;		/* first used byte in buffer */
	int			flags;		/* from VOP call */
	int			resynch;	/* T/F: resynch with cursor */
	put_listent_func_t	put_listent;	/* list output fmt function */
	int			index;		/* index into output buffer */
};
116 117 118 119 120


/*========================================================================
 * Function prototypes for the kernel.
 *========================================================================*/
L
Linus Torvalds 已提交
121 122 123 124 125

/*
 * Overall external interface routines.
 */
int xfs_attr_inactive(struct xfs_inode *dp);
126
int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *);
127
int xfs_attr_list_int(struct xfs_attr_list_context *);
128
int xfs_inode_hasattr(struct xfs_inode *ip);
129
int xfs_attr_get_ilocked(struct xfs_da_args *args);
130
int xfs_attr_get(struct xfs_da_args *args);
131
int xfs_attr_set(struct xfs_da_args *args);
132
int xfs_attr_set_args(struct xfs_da_args *args);
133
int xfs_attr_remove_args(struct xfs_da_args *args);
D
Dave Chinner 已提交
134 135
int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
		  int flags, struct attrlist_cursor_kern *cursor);
136
bool xfs_attr_namecheck(const void *name, size_t length);
L
Linus Torvalds 已提交
137 138

#endif	/* __XFS_ATTR_H__ */