diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_attr.h')
| -rw-r--r-- | fs/xfs/libxfs/xfs_attr.h | 114 | 
1 files changed, 23 insertions, 91 deletions
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h index 4243b2272642..0d2d05908537 100644 --- a/fs/xfs/libxfs/xfs_attr.h +++ b/fs/xfs/libxfs/xfs_attr.h @@ -21,39 +21,6 @@ struct xfs_attr_list_context;   * as possible so as to fit into the literal area of the inode.   */ -/*======================================================================== - * External interfaces - *========================================================================*/ - - -#define ATTR_DONTFOLLOW	0x0001	/* -- ignored, from IRIX -- */ -#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 */ - -#define ATTR_KERNOTIME	0x1000	/* [kernel] don't update inode timestamps */ -#define ATTR_KERNOVAL	0x2000	/* [kernel] get attr size only, not value */ - -#define ATTR_INCOMPLETE	0x4000	/* [kernel] return INCOMPLETE attr keys */ -#define ATTR_ALLOC	0x8000	/* [kernel] allocate xattr buffer on demand */ - -#define ATTR_KERNEL_FLAGS \ -	(ATTR_KERNOTIME | ATTR_KERNOVAL | ATTR_INCOMPLETE | ATTR_ALLOC) - -#define XFS_ATTR_FLAGS \ -	{ ATTR_DONTFOLLOW, 	"DONTFOLLOW" }, \ -	{ ATTR_ROOT,		"ROOT" }, \ -	{ ATTR_TRUST,		"TRUST" }, \ -	{ ATTR_SECURE,		"SECURE" }, \ -	{ ATTR_CREATE,		"CREATE" }, \ -	{ ATTR_REPLACE,		"REPLACE" }, \ -	{ ATTR_KERNOTIME,	"KERNOTIME" }, \ -	{ ATTR_KERNOVAL,	"KERNOVAL" }, \ -	{ ATTR_INCOMPLETE,	"INCOMPLETE" }, \ -	{ ATTR_ALLOC,		"ALLOC" } -  /*   * 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 @@ -62,45 +29,16 @@ struct xfs_attr_list_context;  #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; - -/* - * Given a pointer to the (char*) buffer containing the attr_list() result, - * and an index, return a pointer to the indicated attribute in the buffer. - */ -#define	ATTR_ENTRY(buffer, index)		\ -	((attrlist_ent_t *)			\ -	 &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ]) - -/*   * Kernel-internal version of the attrlist cursor.   */ -typedef struct attrlist_cursor_kern { +struct xfs_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; +};  /*======================================================================== @@ -112,27 +50,28 @@ typedef struct attrlist_cursor_kern {  typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,  			      unsigned char *, int, int); -typedef struct xfs_attr_list_context { -	struct xfs_trans		*tp; -	struct xfs_inode		*dp;		/* inode */ -	struct attrlist_cursor_kern	*cursor;	/* position in list */ -	char				*alist;		/* output buffer */ +struct xfs_attr_list_context { +	struct xfs_trans	*tp; +	struct xfs_inode	*dp;		/* inode */ +	struct xfs_attrlist_cursor_kern cursor;	/* position in list */ +	void			*buffer;	/* output buffer */  	/*  	 * Abort attribute list iteration if non-zero.  Can be used to pass  	 * error values to the xfs_attr_list caller.  	 */ -	int				seen_enough; +	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 */ -} xfs_attr_list_context_t; +	ssize_t			count;		/* num used entries */ +	int			dupcnt;		/* count dup hashvals seen */ +	int			bufsize;	/* total buffer size */ +	int			firstu;		/* first used byte in buffer */ +	unsigned int		attr_filter;	/* XFS_ATTR_{ROOT,SECURE} */ +	int			resynch;	/* T/F: resynch with cursor */ +	put_listent_func_t	put_listent;	/* list output fmt function */ +	int			index;		/* index into output buffer */ +};  /*======================================================================== @@ -143,21 +82,14 @@ typedef struct xfs_attr_list_context {   * Overall external interface routines.   */  int xfs_attr_inactive(struct xfs_inode *dp); -int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *); -int xfs_attr_list_int(struct xfs_attr_list_context *); +int xfs_attr_list_ilocked(struct xfs_attr_list_context *); +int xfs_attr_list(struct xfs_attr_list_context *);  int xfs_inode_hasattr(struct xfs_inode *ip); -int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args); -int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name, -		 size_t namelen, unsigned char **value, int *valuelenp, -		 int flags); -int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name, -		 size_t namelen, unsigned char *value, int valuelen, int flags); +int xfs_attr_get_ilocked(struct xfs_da_args *args); +int xfs_attr_get(struct xfs_da_args *args); +int xfs_attr_set(struct xfs_da_args *args);  int xfs_attr_set_args(struct xfs_da_args *args); -int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, -		    size_t namelen, int flags);  int xfs_attr_remove_args(struct xfs_da_args *args); -int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize, -		  int flags, struct attrlist_cursor_kern *cursor);  bool xfs_attr_namecheck(const void *name, size_t length);  #endif	/* __XFS_ATTR_H__ */  |