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