1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2000,2002-2005 Silicon Graphics, Inc.
6 #ifndef __XFS_BMAP_BTREE_H__
7 #define __XFS_BMAP_BTREE_H__
10 struct xfs_btree_block
;
14 struct xbtree_ifakeroot
;
17 * Maximum number of bmap btree levels.
19 #define XFS_BM_MAXLEVELS(mp,w) ((mp)->m_bm_maxlevels[(w)])
22 * Prototypes for xfs_bmap.c to call.
24 extern void xfs_bmdr_to_bmbt(struct xfs_inode
*, xfs_bmdr_block_t
*, int,
25 struct xfs_btree_block
*, int);
27 void xfs_bmbt_disk_set_all(struct xfs_bmbt_rec
*r
, struct xfs_bmbt_irec
*s
);
28 extern xfs_filblks_t
xfs_bmbt_disk_get_blockcount(const struct xfs_bmbt_rec
*r
);
29 extern xfs_fileoff_t
xfs_bmbt_disk_get_startoff(const struct xfs_bmbt_rec
*r
);
30 void xfs_bmbt_disk_get_all(const struct xfs_bmbt_rec
*r
,
31 struct xfs_bmbt_irec
*s
);
33 extern void xfs_bmbt_to_bmdr(struct xfs_mount
*, struct xfs_btree_block
*, int,
34 xfs_bmdr_block_t
*, int);
36 extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur
*, int level
);
37 extern int xfs_bmdr_maxrecs(int blocklen
, int leaf
);
38 unsigned int xfs_bmbt_maxrecs(struct xfs_mount
*mp
, unsigned int blocklen
,
41 extern int xfs_bmbt_change_owner(struct xfs_trans
*tp
, struct xfs_inode
*ip
,
42 int whichfork
, xfs_ino_t new_owner
,
43 struct list_head
*buffer_list
);
45 extern struct xfs_btree_cur
*xfs_bmbt_init_cursor(struct xfs_mount
*,
46 struct xfs_trans
*, struct xfs_inode
*, int);
47 void xfs_bmbt_commit_staged_btree(struct xfs_btree_cur
*cur
,
48 struct xfs_trans
*tp
, int whichfork
);
50 extern unsigned long long xfs_bmbt_calc_size(struct xfs_mount
*mp
,
51 unsigned long long len
);
53 unsigned int xfs_bmbt_maxlevels_ondisk(void);
55 int __init
xfs_bmbt_init_cur_cache(void);
56 void xfs_bmbt_destroy_cur_cache(void);
58 void xfs_bmbt_init_block(struct xfs_inode
*ip
, struct xfs_btree_block
*buf
,
59 struct xfs_buf
*bp
, __u16 level
, __u16 numrecs
);
62 * Btree block header size depends on a superblock flag.
65 xfs_bmbt_block_len(struct xfs_mount
*mp
)
67 return xfs_has_crc(mp
) ?
68 XFS_BTREE_LBLOCK_CRC_LEN
: XFS_BTREE_LBLOCK_LEN
;
71 /* Addresses of key, pointers, and records within an incore bmbt block. */
73 static inline struct xfs_bmbt_rec
*
76 struct xfs_btree_block
*block
,
79 return (struct xfs_bmbt_rec
*)
80 ((char *)block
+ xfs_bmbt_block_len(mp
) +
81 (index
- 1) * sizeof(struct xfs_bmbt_rec
));
84 static inline struct xfs_bmbt_key
*
87 struct xfs_btree_block
*block
,
90 return (struct xfs_bmbt_key
*)
91 ((char *)block
+ xfs_bmbt_block_len(mp
) +
92 (index
- 1) * sizeof(struct xfs_bmbt_key
*));
95 static inline xfs_bmbt_ptr_t
*
98 struct xfs_btree_block
*block
,
100 unsigned int maxrecs
)
102 return (xfs_bmbt_ptr_t
*)
103 ((char *)block
+ xfs_bmbt_block_len(mp
) +
104 maxrecs
* sizeof(struct xfs_bmbt_key
) +
105 (index
- 1) * sizeof(xfs_bmbt_ptr_t
));
108 /* Addresses of key, pointers, and records within an ondisk bmbt block. */
110 static inline struct xfs_bmbt_rec
*
112 struct xfs_bmdr_block
*block
,
115 return (struct xfs_bmbt_rec
*)
116 ((char *)(block
+ 1) +
117 (index
- 1) * sizeof(struct xfs_bmbt_rec
));
120 static inline struct xfs_bmbt_key
*
122 struct xfs_bmdr_block
*block
,
125 return (struct xfs_bmbt_key
*)
126 ((char *)(block
+ 1) +
127 (index
- 1) * sizeof(struct xfs_bmbt_key
));
130 static inline xfs_bmbt_ptr_t
*
132 struct xfs_bmdr_block
*block
,
134 unsigned int maxrecs
)
136 return (xfs_bmbt_ptr_t
*)
137 ((char *)(block
+ 1) +
138 maxrecs
* sizeof(struct xfs_bmbt_key
) +
139 (index
- 1) * sizeof(xfs_bmbt_ptr_t
));
143 * Address of pointers within the incore btree root.
145 * These are to be used when we know the size of the block and
146 * we don't have a cursor.
148 static inline xfs_bmbt_ptr_t
*
149 xfs_bmap_broot_ptr_addr(
150 struct xfs_mount
*mp
,
151 struct xfs_btree_block
*bb
,
155 return xfs_bmbt_ptr_addr(mp
, bb
, i
, xfs_bmbt_maxrecs(mp
, sz
, false));
159 * Compute the space required for the incore btree root containing the given
163 xfs_bmap_broot_space_calc(
164 struct xfs_mount
*mp
,
167 return xfs_bmbt_block_len(mp
) +
168 (nrecs
* (sizeof(struct xfs_bmbt_key
) + sizeof(xfs_bmbt_ptr_t
)));
172 * Compute the space required for the incore btree root given the ondisk
176 xfs_bmap_broot_space(
177 struct xfs_mount
*mp
,
178 struct xfs_bmdr_block
*bb
)
180 return xfs_bmap_broot_space_calc(mp
, be16_to_cpu(bb
->bb_numrecs
));
183 /* Compute the space required for the ondisk root block. */
185 xfs_bmdr_space_calc(unsigned int nrecs
)
187 return sizeof(struct xfs_bmdr_block
) +
188 (nrecs
* (sizeof(struct xfs_bmbt_key
) + sizeof(xfs_bmbt_ptr_t
)));
192 * Compute the space required for the ondisk root block given an incore root
196 xfs_bmap_bmdr_space(struct xfs_btree_block
*bb
)
198 return xfs_bmdr_space_calc(be16_to_cpu(bb
->bb_numrecs
));
201 #endif /* __XFS_BMAP_BTREE_H__ */