xref: /openbmc/linux/fs/xfs/libxfs/xfs_attr_leaf.h (revision d37cf9b63113f13d742713881ce691fc615d8b3b)
1508578f2SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
284be0ffcSDave Chinner /*
384be0ffcSDave Chinner  * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
484be0ffcSDave Chinner  * Copyright (c) 2013 Red Hat, Inc.
584be0ffcSDave Chinner  * All Rights Reserved.
684be0ffcSDave Chinner  */
784be0ffcSDave Chinner #ifndef __XFS_ATTR_LEAF_H__
884be0ffcSDave Chinner #define	__XFS_ATTR_LEAF_H__
984be0ffcSDave Chinner 
1084be0ffcSDave Chinner struct attrlist;
1184be0ffcSDave Chinner struct xfs_attr_list_context;
1284be0ffcSDave Chinner struct xfs_da_args;
1384be0ffcSDave Chinner struct xfs_da_state;
1484be0ffcSDave Chinner struct xfs_da_state_blk;
1584be0ffcSDave Chinner struct xfs_inode;
1684be0ffcSDave Chinner struct xfs_trans;
1784be0ffcSDave Chinner 
1884be0ffcSDave Chinner /*
19a39f089aSChristoph Hellwig  * Incore version of the attribute leaf header.
20a39f089aSChristoph Hellwig  */
21a39f089aSChristoph Hellwig struct xfs_attr3_icleaf_hdr {
22a39f089aSChristoph Hellwig 	uint32_t	forw;
23a39f089aSChristoph Hellwig 	uint32_t	back;
24a39f089aSChristoph Hellwig 	uint16_t	magic;
25a39f089aSChristoph Hellwig 	uint16_t	count;
26a39f089aSChristoph Hellwig 	uint16_t	usedbytes;
27a39f089aSChristoph Hellwig 	/*
28a39f089aSChristoph Hellwig 	 * Firstused is 32-bit here instead of 16-bit like the on-disk variant
29a39f089aSChristoph Hellwig 	 * to support maximum fsb size of 64k without overflow issues throughout
30a39f089aSChristoph Hellwig 	 * the attr code. Instead, the overflow condition is handled on
31a39f089aSChristoph Hellwig 	 * conversion to/from disk.
32a39f089aSChristoph Hellwig 	 */
33a39f089aSChristoph Hellwig 	uint32_t	firstused;
34a39f089aSChristoph Hellwig 	__u8		holes;
35a39f089aSChristoph Hellwig 	struct {
36a39f089aSChristoph Hellwig 		uint16_t	base;
37a39f089aSChristoph Hellwig 		uint16_t	size;
38a39f089aSChristoph Hellwig 	} freemap[XFS_ATTR_LEAF_MAPSIZE];
39a39f089aSChristoph Hellwig };
40a39f089aSChristoph Hellwig 
4184be0ffcSDave Chinner /*========================================================================
4284be0ffcSDave Chinner  * Function prototypes for the kernel.
4384be0ffcSDave Chinner  *========================================================================*/
4484be0ffcSDave Chinner 
4584be0ffcSDave Chinner /*
4684be0ffcSDave Chinner  * Internal routines when attribute fork size < XFS_LITINO(mp).
4784be0ffcSDave Chinner  */
4884be0ffcSDave Chinner void	xfs_attr_shortform_create(struct xfs_da_args *args);
4984be0ffcSDave Chinner void	xfs_attr_shortform_add(struct xfs_da_args *args, int forkoff);
5084be0ffcSDave Chinner int	xfs_attr_shortform_lookup(struct xfs_da_args *args);
5184be0ffcSDave Chinner int	xfs_attr_shortform_getvalue(struct xfs_da_args *args);
52e53bcffaSDarrick J. Wong int	xfs_attr_shortform_to_leaf(struct xfs_da_args *args);
53816c8e39SAllison Henderson int	xfs_attr_sf_removename(struct xfs_da_args *args);
5407120f1aSAllison Collins int	xfs_attr_sf_findname(struct xfs_da_args *args,
5507120f1aSAllison Collins 			     struct xfs_attr_sf_entry **sfep,
5607120f1aSAllison Collins 			     unsigned int *basep);
5784be0ffcSDave Chinner int	xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp);
58ae90b994SDarrick J. Wong int	xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes);
591e1bbd8eSDarrick J. Wong xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_inode *ip);
606dfe5a04SDave Chinner void	xfs_attr_fork_remove(struct xfs_inode *ip, struct xfs_trans *tp);
6184be0ffcSDave Chinner 
6284be0ffcSDave Chinner /*
6384be0ffcSDave Chinner  * Internal routines when attribute fork size == XFS_LBSIZE(mp).
6484be0ffcSDave Chinner  */
6584be0ffcSDave Chinner int	xfs_attr3_leaf_to_node(struct xfs_da_args *args);
6684be0ffcSDave Chinner int	xfs_attr3_leaf_to_shortform(struct xfs_buf *bp,
6784be0ffcSDave Chinner 				   struct xfs_da_args *args, int forkoff);
6884be0ffcSDave Chinner int	xfs_attr3_leaf_clearflag(struct xfs_da_args *args);
6984be0ffcSDave Chinner int	xfs_attr3_leaf_setflag(struct xfs_da_args *args);
7084be0ffcSDave Chinner int	xfs_attr3_leaf_flipflags(struct xfs_da_args *args);
7184be0ffcSDave Chinner 
7284be0ffcSDave Chinner /*
7384be0ffcSDave Chinner  * Routines used for growing the Btree.
7484be0ffcSDave Chinner  */
7584be0ffcSDave Chinner int	xfs_attr3_leaf_split(struct xfs_da_state *state,
7684be0ffcSDave Chinner 				   struct xfs_da_state_blk *oldblk,
7784be0ffcSDave Chinner 				   struct xfs_da_state_blk *newblk);
7884be0ffcSDave Chinner int	xfs_attr3_leaf_lookup_int(struct xfs_buf *leaf,
7984be0ffcSDave Chinner 					struct xfs_da_args *args);
8084be0ffcSDave Chinner int	xfs_attr3_leaf_getvalue(struct xfs_buf *bp, struct xfs_da_args *args);
81*702e1ac4SChristoph Hellwig bool	xfs_attr3_leaf_add(struct xfs_buf *leaf_buffer,
8284be0ffcSDave Chinner 				 struct xfs_da_args *args);
8384be0ffcSDave Chinner int	xfs_attr3_leaf_remove(struct xfs_buf *leaf_buffer,
8484be0ffcSDave Chinner 				    struct xfs_da_args *args);
8516c6e92cSDarrick J. Wong int	xfs_attr3_leaf_list_int(struct xfs_buf *bp,
8684be0ffcSDave Chinner 				struct xfs_attr_list_context *context);
8784be0ffcSDave Chinner 
8884be0ffcSDave Chinner /*
8984be0ffcSDave Chinner  * Routines used for shrinking the Btree.
9084be0ffcSDave Chinner  */
9184be0ffcSDave Chinner int	xfs_attr3_leaf_toosmall(struct xfs_da_state *state, int *retval);
9284be0ffcSDave Chinner void	xfs_attr3_leaf_unbalance(struct xfs_da_state *state,
9384be0ffcSDave Chinner 				       struct xfs_da_state_blk *drop_blk,
9484be0ffcSDave Chinner 				       struct xfs_da_state_blk *save_blk);
9584be0ffcSDave Chinner /*
9684be0ffcSDave Chinner  * Utility routines.
9784be0ffcSDave Chinner  */
9884be0ffcSDave Chinner xfs_dahash_t	xfs_attr_leaf_lasthash(struct xfs_buf *bp, int *count);
9984be0ffcSDave Chinner int	xfs_attr_leaf_order(struct xfs_buf *leaf1_bp,
10084be0ffcSDave Chinner 				   struct xfs_buf *leaf2_bp);
10184be0ffcSDave Chinner int	xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local);
10284be0ffcSDave Chinner int	xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp,
103dfb87594SChristoph Hellwig 			xfs_dablk_t bno, struct xfs_buf **bpp);
1042f661241SBrian Foster void	xfs_attr3_leaf_hdr_from_disk(struct xfs_da_geometry *geo,
1052f661241SBrian Foster 				     struct xfs_attr3_icleaf_hdr *to,
10684be0ffcSDave Chinner 				     struct xfs_attr_leafblock *from);
1072f661241SBrian Foster void	xfs_attr3_leaf_hdr_to_disk(struct xfs_da_geometry *geo,
1082f661241SBrian Foster 				   struct xfs_attr_leafblock *to,
10984be0ffcSDave Chinner 				   struct xfs_attr3_icleaf_hdr *from);
11084be0ffcSDave Chinner 
11184be0ffcSDave Chinner #endif	/* __XFS_ATTR_LEAF_H__ */
112