1/* 2 * Copyright (c) 2000,2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18#ifndef __XFS_DIR2_NODE_H__ 19#define __XFS_DIR2_NODE_H__ 20 21/* 22 * Directory version 2, btree node format structures 23 */ 24 25struct uio; 26struct xfs_dabuf; 27struct xfs_da_args; 28struct xfs_da_state; 29struct xfs_da_state_blk; 30struct xfs_inode; 31struct xfs_trans; 32 33/* 34 * Offset of the freespace index. 35 */ 36#define XFS_DIR2_FREE_SPACE 2 37#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) 38#define XFS_DIR2_FREE_FIRSTDB(mp) \ 39 xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) 40 41#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F */ 42 43typedef struct xfs_dir2_free_hdr { 44 __be32 magic; /* XFS_DIR2_FREE_MAGIC */ 45 __be32 firstdb; /* db of first entry */ 46 __be32 nvalid; /* count of valid entries */ 47 __be32 nused; /* count of used entries */ 48} xfs_dir2_free_hdr_t; 49 50typedef struct xfs_dir2_free { 51 xfs_dir2_free_hdr_t hdr; /* block header */ 52 __be16 bests[1]; /* best free counts */ 53 /* unused entries are -1 */ 54} xfs_dir2_free_t; 55 56#define XFS_DIR2_MAX_FREE_BESTS(mp) \ 57 (((mp)->m_dirblksize - (uint)sizeof(xfs_dir2_free_hdr_t)) / \ 58 (uint)sizeof(xfs_dir2_data_off_t)) 59 60/* 61 * Convert data space db to the corresponding free db. 62 */ 63static inline xfs_dir2_db_t 64xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) 65{ 66 return (XFS_DIR2_FREE_FIRSTDB(mp) + (db) / XFS_DIR2_MAX_FREE_BESTS(mp)); 67} 68 69/* 70 * Convert data space db to the corresponding index in a free db. 71 */ 72static inline int 73xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) 74{ 75 return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); 76} 77 78extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, 79 struct xfs_dabuf *lbp); 80extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *count); 81extern int xfs_dir2_leafn_lookup_int(struct xfs_dabuf *bp, 82 struct xfs_da_args *args, int *indexp, 83 struct xfs_da_state *state); 84extern int xfs_dir2_leafn_order(struct xfs_dabuf *leaf1_bp, 85 struct xfs_dabuf *leaf2_bp); 86extern int xfs_dir2_leafn_split(struct xfs_da_state *state, 87 struct xfs_da_state_blk *oldblk, 88 struct xfs_da_state_blk *newblk); 89extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action); 90extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, 91 struct xfs_da_state_blk *drop_blk, 92 struct xfs_da_state_blk *save_blk); 93extern int xfs_dir2_node_addname(struct xfs_da_args *args); 94extern int xfs_dir2_node_lookup(struct xfs_da_args *args); 95extern int xfs_dir2_node_removename(struct xfs_da_args *args); 96extern int xfs_dir2_node_replace(struct xfs_da_args *args); 97extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t fo, 98 int *rvalp); 99 100#endif /* __XFS_DIR2_NODE_H__ */ 101