xref: /kernel/linux/linux-5.10/fs/xfs/libxfs/xfs_attr.h (revision 8c2ecf20)
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
9struct xfs_inode;
10struct xfs_da_args;
11struct 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 * The maximum size (into the kernel or returned from the kernel) of an
26 * attribute value or the buffer used for an attr_list() call.  Larger
27 * sizes will result in an ERANGE return code.
28 */
29#define	ATTR_MAX_VALUELEN	(64*1024)	/* max length of a value */
30
31/*
32 * Kernel-internal version of the attrlist cursor.
33 */
34struct xfs_attrlist_cursor_kern {
35	__u32	hashval;	/* hash value of next entry to add */
36	__u32	blkno;		/* block containing entry (suggestion) */
37	__u32	offset;		/* offset in list of equal-hashvals */
38	__u16	pad1;		/* padding to match user-level */
39	__u8	pad2;		/* padding to match user-level */
40	__u8	initted;	/* T/F: cursor has been initialized */
41};
42
43
44/*========================================================================
45 * Structure used to pass context around among the routines.
46 *========================================================================*/
47
48
49/* void; state communicated via *context */
50typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
51			      unsigned char *, int, int);
52
53struct xfs_attr_list_context {
54	struct xfs_trans	*tp;
55	struct xfs_inode	*dp;		/* inode */
56	struct xfs_attrlist_cursor_kern cursor;	/* position in list */
57	void			*buffer;	/* output buffer */
58
59	/*
60	 * Abort attribute list iteration if non-zero.  Can be used to pass
61	 * error values to the xfs_attr_list caller.
62	 */
63	int			seen_enough;
64	bool			allow_incomplete;
65
66	ssize_t			count;		/* num used entries */
67	int			dupcnt;		/* count dup hashvals seen */
68	int			bufsize;	/* total buffer size */
69	int			firstu;		/* first used byte in buffer */
70	unsigned int		attr_filter;	/* XFS_ATTR_{ROOT,SECURE} */
71	int			resynch;	/* T/F: resynch with cursor */
72	put_listent_func_t	put_listent;	/* list output fmt function */
73	int			index;		/* index into output buffer */
74};
75
76
77/*========================================================================
78 * Function prototypes for the kernel.
79 *========================================================================*/
80
81/*
82 * Overall external interface routines.
83 */
84int xfs_attr_inactive(struct xfs_inode *dp);
85int xfs_attr_list_ilocked(struct xfs_attr_list_context *);
86int xfs_attr_list(struct xfs_attr_list_context *);
87int xfs_inode_hasattr(struct xfs_inode *ip);
88int xfs_attr_get_ilocked(struct xfs_da_args *args);
89int xfs_attr_get(struct xfs_da_args *args);
90int xfs_attr_set(struct xfs_da_args *args);
91int xfs_attr_set_args(struct xfs_da_args *args);
92int xfs_has_attr(struct xfs_da_args *args);
93int xfs_attr_remove_args(struct xfs_da_args *args);
94bool xfs_attr_namecheck(const void *name, size_t length);
95
96#endif	/* __XFS_ATTR_H__ */
97