0001
0002
0003
0004
0005
0006
0007 #ifndef __XFS_DA_BTREE_H__
0008 #define __XFS_DA_BTREE_H__
0009
0010 struct xfs_inode;
0011 struct xfs_trans;
0012
0013
0014
0015
0016
0017
0018 struct xfs_da_geometry {
0019 unsigned int blksize;
0020 unsigned int fsbcount;
0021 uint8_t fsblog;
0022 uint8_t blklog;
0023 unsigned int node_hdr_size;
0024 unsigned int node_ents;
0025 unsigned int magicpct;
0026 xfs_dablk_t datablk;
0027 unsigned int leaf_hdr_size;
0028 unsigned int leaf_max_ents;
0029 xfs_dablk_t leafblk;
0030 unsigned int free_hdr_size;
0031 unsigned int free_max_bests;
0032 xfs_dablk_t freeblk;
0033 xfs_extnum_t max_extents;
0034
0035 xfs_dir2_data_aoff_t data_first_offset;
0036 size_t data_entry_offset;
0037 };
0038
0039
0040
0041
0042
0043
0044
0045
0046 enum xfs_dacmp {
0047 XFS_CMP_DIFFERENT,
0048 XFS_CMP_EXACT,
0049 XFS_CMP_CASE
0050 };
0051
0052
0053
0054
0055 typedef struct xfs_da_args {
0056 struct xfs_da_geometry *geo;
0057 const uint8_t *name;
0058 int namelen;
0059 uint8_t filetype;
0060 void *value;
0061 int valuelen;
0062 unsigned int attr_filter;
0063 unsigned int attr_flags;
0064 xfs_dahash_t hashval;
0065 xfs_ino_t inumber;
0066 struct xfs_inode *dp;
0067 struct xfs_trans *trans;
0068 xfs_extlen_t total;
0069 int whichfork;
0070 xfs_dablk_t blkno;
0071 int index;
0072 xfs_dablk_t rmtblkno;
0073 int rmtblkcnt;
0074 int rmtvaluelen;
0075 xfs_dablk_t blkno2;
0076 int index2;
0077 xfs_dablk_t rmtblkno2;
0078 int rmtblkcnt2;
0079 int rmtvaluelen2;
0080 uint32_t op_flags;
0081 enum xfs_dacmp cmpresult;
0082 } xfs_da_args_t;
0083
0084
0085
0086
0087 #define XFS_DA_OP_JUSTCHECK (1u << 0)
0088 #define XFS_DA_OP_REPLACE (1u << 1)
0089 #define XFS_DA_OP_ADDNAME (1u << 2)
0090 #define XFS_DA_OP_OKNOENT (1u << 3)
0091 #define XFS_DA_OP_CILOOKUP (1u << 4)
0092 #define XFS_DA_OP_NOTIME (1u << 5)
0093 #define XFS_DA_OP_REMOVE (1u << 6)
0094 #define XFS_DA_OP_RECOVERY (1u << 7)
0095 #define XFS_DA_OP_LOGGED (1u << 8)
0096
0097 #define XFS_DA_OP_FLAGS \
0098 { XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \
0099 { XFS_DA_OP_REPLACE, "REPLACE" }, \
0100 { XFS_DA_OP_ADDNAME, "ADDNAME" }, \
0101 { XFS_DA_OP_OKNOENT, "OKNOENT" }, \
0102 { XFS_DA_OP_CILOOKUP, "CILOOKUP" }, \
0103 { XFS_DA_OP_NOTIME, "NOTIME" }, \
0104 { XFS_DA_OP_REMOVE, "REMOVE" }, \
0105 { XFS_DA_OP_RECOVERY, "RECOVERY" }, \
0106 { XFS_DA_OP_LOGGED, "LOGGED" }
0107
0108
0109
0110
0111
0112
0113
0114
0115 typedef struct xfs_da_state_blk {
0116 struct xfs_buf *bp;
0117 xfs_dablk_t blkno;
0118 xfs_daddr_t disk_blkno;
0119 int index;
0120 xfs_dahash_t hashval;
0121 int magic;
0122 } xfs_da_state_blk_t;
0123
0124 typedef struct xfs_da_state_path {
0125 int active;
0126 xfs_da_state_blk_t blk[XFS_DA_NODE_MAXDEPTH];
0127 } xfs_da_state_path_t;
0128
0129 typedef struct xfs_da_state {
0130 xfs_da_args_t *args;
0131 struct xfs_mount *mp;
0132 xfs_da_state_path_t path;
0133 xfs_da_state_path_t altpath;
0134 unsigned char inleaf;
0135 unsigned char extravalid;
0136 unsigned char extraafter;
0137 xfs_da_state_blk_t extrablk;
0138
0139 } xfs_da_state_t;
0140
0141
0142
0143
0144
0145
0146 struct xfs_da3_icnode_hdr {
0147 uint32_t forw;
0148 uint32_t back;
0149 uint16_t magic;
0150 uint16_t count;
0151 uint16_t level;
0152
0153
0154
0155
0156
0157 struct xfs_da_node_entry *btree;
0158 };
0159
0160
0161
0162
0163 #define XFS_DA_LOGOFF(BASE, ADDR) ((char *)(ADDR) - (char *)(BASE))
0164 #define XFS_DA_LOGRANGE(BASE, ADDR, SIZE) \
0165 (uint)(XFS_DA_LOGOFF(BASE, ADDR)), \
0166 (uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1)
0167
0168
0169
0170
0171
0172
0173
0174
0175 int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno,
0176 int level, struct xfs_buf **bpp, int whichfork);
0177 int xfs_da3_split(xfs_da_state_t *state);
0178
0179
0180
0181
0182 int xfs_da3_join(xfs_da_state_t *state);
0183 void xfs_da3_fixhashpath(struct xfs_da_state *state,
0184 struct xfs_da_state_path *path_to_to_fix);
0185
0186
0187
0188
0189 int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result);
0190 int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
0191 int forward, int release, int *result);
0192
0193
0194
0195 int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
0196 xfs_da_state_blk_t *new_blk);
0197 int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
0198 xfs_dablk_t bno, struct xfs_buf **bpp, int whichfork);
0199 int xfs_da3_node_read_mapped(struct xfs_trans *tp, struct xfs_inode *dp,
0200 xfs_daddr_t mappedbno, struct xfs_buf **bpp,
0201 int whichfork);
0202
0203
0204
0205
0206
0207 #define XFS_DABUF_MAP_HOLE_OK (1u << 0)
0208
0209 int xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno);
0210 int xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno,
0211 int count);
0212 int xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp,
0213 xfs_dablk_t bno, struct xfs_buf **bp, int whichfork);
0214 int xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
0215 xfs_dablk_t bno, unsigned int flags, struct xfs_buf **bpp,
0216 int whichfork, const struct xfs_buf_ops *ops);
0217 int xfs_da_reada_buf(struct xfs_inode *dp, xfs_dablk_t bno,
0218 unsigned int flags, int whichfork,
0219 const struct xfs_buf_ops *ops);
0220 int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
0221 struct xfs_buf *dead_buf);
0222
0223 uint xfs_da_hashname(const uint8_t *name_string, int name_length);
0224 enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args,
0225 const unsigned char *name, int len);
0226
0227
0228 struct xfs_da_state *xfs_da_state_alloc(struct xfs_da_args *args);
0229 void xfs_da_state_free(xfs_da_state_t *state);
0230 void xfs_da_state_reset(struct xfs_da_state *state, struct xfs_da_args *args);
0231
0232 void xfs_da3_node_hdr_from_disk(struct xfs_mount *mp,
0233 struct xfs_da3_icnode_hdr *to, struct xfs_da_intnode *from);
0234 void xfs_da3_node_hdr_to_disk(struct xfs_mount *mp,
0235 struct xfs_da_intnode *to, struct xfs_da3_icnode_hdr *from);
0236
0237 extern struct kmem_cache *xfs_da_state_cache;
0238
0239 #endif