2018-06-05 19:42:14 -07:00
// SPDX-License-Identifier: GPL-2.0
2005-04-16 15:20:36 -07:00
/*
2005-11-02 14:58:39 +11:00
* Copyright ( c ) 2000 , 2002 - 2003 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-16 15:20:36 -07:00
*/
# ifndef __XFS_ATTR_H__
# define __XFS_ATTR_H__
2008-06-23 13:23:48 +10:00
struct xfs_inode ;
struct xfs_da_args ;
struct xfs_attr_list_context ;
2005-04-16 15:20:36 -07:00
/*
* 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
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2020-01-07 15:25:37 -08:00
# define ATTR_DONTFOLLOW 0x0001 /* -- ignored, from IRIX -- */
2005-04-16 15:20:36 -07:00
# 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 */
2009-12-14 23:14:59 +00:00
# define XFS_ATTR_FLAGS \
{ ATTR_DONTFOLLOW , " DONTFOLLOW " } , \
{ ATTR_ROOT , " ROOT " } , \
{ ATTR_TRUST , " TRUST " } , \
{ ATTR_SECURE , " SECURE " } , \
{ ATTR_CREATE , " CREATE " } , \
2020-02-26 17:30:36 -08:00
{ ATTR_REPLACE , " REPLACE " }
2009-12-14 23:14:59 +00:00
2005-04-16 15:20:36 -07:00
/*
* 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 */
/*
* 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 ;
/*========================================================================
2008-06-23 13:23:48 +10:00
* Structure used to pass context around among the routines .
2005-04-16 15:20:36 -07:00
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2008-06-23 13:23:48 +10:00
2016-12-05 12:32:14 +11:00
/* void; state communicated via *context */
typedef void ( * put_listent_func_t ) ( struct xfs_attr_list_context * , int ,
2016-04-06 07:57:32 +10:00
unsigned char * , int , int ) ;
2008-06-23 13:23:48 +10:00
2020-02-26 17:30:37 -08:00
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 */
2019-07-05 10:29:54 -07:00
/*
* Abort attribute list iteration if non - zero . Can be used to pass
* error values to the xfs_attr_list caller .
*/
2020-02-26 17:30:37 -08:00
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 */
} ;
2008-06-23 13:23:48 +10:00
/*========================================================================
* Function prototypes for the kernel .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
2005-04-16 15:20:36 -07:00
/*
* Overall external interface routines .
*/
int xfs_attr_inactive ( struct xfs_inode * dp ) ;
2017-06-16 11:00:14 -07:00
int xfs_attr_list_int_ilocked ( struct xfs_attr_list_context * ) ;
2008-06-23 13:23:48 +10:00
int xfs_attr_list_int ( struct xfs_attr_list_context * ) ;
2013-08-12 20:49:38 +10:00
int xfs_inode_hasattr ( struct xfs_inode * ip ) ;
2020-02-26 17:30:34 -08:00
int xfs_attr_get_ilocked ( struct xfs_da_args * args ) ;
2020-02-26 17:30:34 -08:00
int xfs_attr_get ( struct xfs_da_args * args ) ;
2020-02-26 17:30:33 -08:00
int xfs_attr_set ( struct xfs_da_args * args ) ;
2019-04-24 09:27:41 -07:00
int xfs_attr_set_args ( struct xfs_da_args * args ) ;
2018-10-18 17:21:23 +11:00
int xfs_attr_remove_args ( struct xfs_da_args * args ) ;
2019-02-01 09:08:54 -08:00
bool xfs_attr_namecheck ( const void * name , size_t length ) ;
2005-04-16 15:20:36 -07:00
# endif /* __XFS_ATTR_H__ */