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 */ 63#define XFS_DIR2_DB_TO_FDB(mp,db) xfs_dir2_db_to_fdb(mp, db) 64static inline xfs_dir2_db_t 65xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) 66{ 67 return (XFS_DIR2_FREE_FIRSTDB(mp) + (db) / XFS_DIR2_MAX_FREE_BESTS(mp)); 68} 69 70/* 71 * Convert data space db to the corresponding index in a free db. 72 */ 73#define XFS_DIR2_DB_TO_FDINDEX(mp,db) xfs_dir2_db_to_fdindex(mp, db) 74static inline int 75xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) 76{ 77 return ((db) % XFS_DIR2_MAX_FREE_BESTS(mp)); 78} 79 80extern void xfs_dir2_free_log_bests(struct xfs_trans *tp, struct xfs_dabuf *bp, 81 int first, int last); 82extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, 83 struct xfs_dabuf *lbp); 84extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_dabuf *bp, int *count); 85extern int xfs_dir2_leafn_lookup_int(struct xfs_dabuf *bp, 86 struct xfs_da_args *args, int *indexp, 87 struct xfs_da_state *state); 88extern int xfs_dir2_leafn_order(struct xfs_dabuf *leaf1_bp, 89 struct xfs_dabuf *leaf2_bp); 90extern int xfs_dir2_leafn_split(struct xfs_da_state *state, 91 struct xfs_da_state_blk *oldblk, 92 struct xfs_da_state_blk *newblk); 93extern int xfs_dir2_leafn_toosmall(struct xfs_da_state *state, int *action); 94extern void xfs_dir2_leafn_unbalance(struct xfs_da_state *state, 95 struct xfs_da_state_blk *drop_blk, 96 struct xfs_da_state_blk *save_blk); 97extern int xfs_dir2_node_addname(struct xfs_da_args *args); 98extern int xfs_dir2_node_lookup(struct xfs_da_args *args); 99extern int xfs_dir2_node_removename(struct xfs_da_args *args); 100extern int xfs_dir2_node_replace(struct xfs_da_args *args); 101extern int xfs_dir2_node_trim_free(struct xfs_da_args *args, xfs_fileoff_t fo, 102 int *rvalp); 103 104#endif /* __XFS_DIR2_NODE_H__ */ 105