1 /* 2 * Copyright (c) 2000-2001,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_H__ 19 #define __XFS_DIR2_H__ 20 21 struct xfs_bmap_free; 22 struct xfs_da_args; 23 struct xfs_inode; 24 struct xfs_mount; 25 struct xfs_trans; 26 struct xfs_dir2_sf_hdr; 27 struct xfs_dir2_sf_entry; 28 struct xfs_dir2_data_hdr; 29 struct xfs_dir2_data_entry; 30 struct xfs_dir2_data_unused; 31 32 extern struct xfs_name xfs_name_dotdot; 33 34 /* 35 * directory operations vector for encode/decode routines 36 */ 37 struct xfs_dir_ops { 38 int (*sf_entsize)(struct xfs_dir2_sf_hdr *hdr, int len); 39 struct xfs_dir2_sf_entry * 40 (*sf_nextentry)(struct xfs_dir2_sf_hdr *hdr, 41 struct xfs_dir2_sf_entry *sfep); 42 __uint8_t (*sf_get_ftype)(struct xfs_dir2_sf_entry *sfep); 43 void (*sf_put_ftype)(struct xfs_dir2_sf_entry *sfep, 44 __uint8_t ftype); 45 xfs_ino_t (*sf_get_ino)(struct xfs_dir2_sf_hdr *hdr, 46 struct xfs_dir2_sf_entry *sfep); 47 void (*sf_put_ino)(struct xfs_dir2_sf_hdr *hdr, 48 struct xfs_dir2_sf_entry *sfep, 49 xfs_ino_t ino); 50 xfs_ino_t (*sf_get_parent_ino)(struct xfs_dir2_sf_hdr *hdr); 51 void (*sf_put_parent_ino)(struct xfs_dir2_sf_hdr *hdr, 52 xfs_ino_t ino); 53 54 int (*data_entsize)(int len); 55 __uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep); 56 void (*data_put_ftype)(struct xfs_dir2_data_entry *dep, 57 __uint8_t ftype); 58 __be16 * (*data_entry_tag_p)(struct xfs_dir2_data_entry *dep); 59 struct xfs_dir2_data_free * 60 (*data_bestfree_p)(struct xfs_dir2_data_hdr *hdr); 61 62 xfs_dir2_data_aoff_t data_dot_offset; 63 xfs_dir2_data_aoff_t data_dotdot_offset; 64 xfs_dir2_data_aoff_t data_first_offset; 65 size_t data_entry_offset; 66 67 struct xfs_dir2_data_entry * 68 (*data_dot_entry_p)(struct xfs_dir2_data_hdr *hdr); 69 struct xfs_dir2_data_entry * 70 (*data_dotdot_entry_p)(struct xfs_dir2_data_hdr *hdr); 71 struct xfs_dir2_data_entry * 72 (*data_first_entry_p)(struct xfs_dir2_data_hdr *hdr); 73 struct xfs_dir2_data_entry * 74 (*data_entry_p)(struct xfs_dir2_data_hdr *hdr); 75 struct xfs_dir2_data_unused * 76 (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); 77 78 int leaf_hdr_size; 79 void (*leaf_hdr_to_disk)(struct xfs_dir2_leaf *to, 80 struct xfs_dir3_icleaf_hdr *from); 81 void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, 82 struct xfs_dir2_leaf *from); 83 int (*leaf_max_ents)(struct xfs_da_geometry *geo); 84 struct xfs_dir2_leaf_entry * 85 (*leaf_ents_p)(struct xfs_dir2_leaf *lp); 86 87 int node_hdr_size; 88 void (*node_hdr_to_disk)(struct xfs_da_intnode *to, 89 struct xfs_da3_icnode_hdr *from); 90 void (*node_hdr_from_disk)(struct xfs_da3_icnode_hdr *to, 91 struct xfs_da_intnode *from); 92 struct xfs_da_node_entry * 93 (*node_tree_p)(struct xfs_da_intnode *dap); 94 95 int free_hdr_size; 96 void (*free_hdr_to_disk)(struct xfs_dir2_free *to, 97 struct xfs_dir3_icfree_hdr *from); 98 void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, 99 struct xfs_dir2_free *from); 100 int (*free_max_bests)(struct xfs_da_geometry *geo); 101 __be16 * (*free_bests_p)(struct xfs_dir2_free *free); 102 xfs_dir2_db_t (*db_to_fdb)(struct xfs_da_geometry *geo, 103 xfs_dir2_db_t db); 104 int (*db_to_fdindex)(struct xfs_da_geometry *geo, 105 xfs_dir2_db_t db); 106 }; 107 108 extern const struct xfs_dir_ops * 109 xfs_dir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp); 110 extern const struct xfs_dir_ops * 111 xfs_nondir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp); 112 113 /* 114 * Generic directory interface routines 115 */ 116 extern void xfs_dir_startup(void); 117 extern int xfs_da_mount(struct xfs_mount *mp); 118 extern void xfs_da_unmount(struct xfs_mount *mp); 119 120 extern int xfs_dir_isempty(struct xfs_inode *dp); 121 extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, 122 struct xfs_inode *pdp); 123 extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp, 124 struct xfs_name *name, xfs_ino_t inum, 125 xfs_fsblock_t *first, 126 struct xfs_bmap_free *flist, xfs_extlen_t tot); 127 extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, 128 struct xfs_name *name, xfs_ino_t *inum, 129 struct xfs_name *ci_name); 130 extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp, 131 struct xfs_name *name, xfs_ino_t ino, 132 xfs_fsblock_t *first, 133 struct xfs_bmap_free *flist, xfs_extlen_t tot); 134 extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, 135 struct xfs_name *name, xfs_ino_t inum, 136 xfs_fsblock_t *first, 137 struct xfs_bmap_free *flist, xfs_extlen_t tot); 138 extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, 139 struct xfs_name *name); 140 141 /* 142 * Direct call from the bmap code, bypassing the generic directory layer. 143 */ 144 extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); 145 146 /* 147 * Interface routines used by userspace utilities 148 */ 149 extern int xfs_dir2_isblock(struct xfs_da_args *args, int *r); 150 extern int xfs_dir2_isleaf(struct xfs_da_args *args, int *r); 151 extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, 152 struct xfs_buf *bp); 153 154 extern void xfs_dir2_data_freescan(struct xfs_inode *dp, 155 struct xfs_dir2_data_hdr *hdr, int *loghead); 156 extern void xfs_dir2_data_log_entry(struct xfs_da_args *args, 157 struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); 158 extern void xfs_dir2_data_log_header(struct xfs_da_args *args, 159 struct xfs_buf *bp); 160 extern void xfs_dir2_data_log_unused(struct xfs_da_args *args, 161 struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); 162 extern void xfs_dir2_data_make_free(struct xfs_da_args *args, 163 struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, 164 xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); 165 extern void xfs_dir2_data_use_free(struct xfs_da_args *args, 166 struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, 167 xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, 168 int *needlogp, int *needscanp); 169 170 extern struct xfs_dir2_data_free *xfs_dir2_data_freefind( 171 struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_free *bf, 172 struct xfs_dir2_data_unused *dup); 173 174 extern const struct xfs_buf_ops xfs_dir3_block_buf_ops; 175 extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; 176 extern const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops; 177 extern const struct xfs_buf_ops xfs_dir3_free_buf_ops; 178 extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; 179 180 #endif /* __XFS_DIR2_H__ */ 181