Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14861c47 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: add helpers to calculate btree size



Add a bunch of helper functions that calculate the sizes of various
btrees.  These will be used to repair btrees and btree headers.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 9d9c9028
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -547,3 +547,12 @@ xfs_allocbt_maxrecs(
		return blocklen / sizeof(xfs_alloc_rec_t);
		return blocklen / sizeof(xfs_alloc_rec_t);
	return blocklen / (sizeof(xfs_alloc_key_t) + sizeof(xfs_alloc_ptr_t));
	return blocklen / (sizeof(xfs_alloc_key_t) + sizeof(xfs_alloc_ptr_t));
}
}

/* Calculate the freespace btree size for some records. */
xfs_extlen_t
xfs_allocbt_calc_size(
	struct xfs_mount	*mp,
	unsigned long long	len)
{
	return xfs_btree_calc_size(mp->m_alloc_mnr, len);
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -61,5 +61,7 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *,
		struct xfs_trans *, struct xfs_buf *,
		struct xfs_trans *, struct xfs_buf *,
		xfs_agnumber_t, xfs_btnum_t);
		xfs_agnumber_t, xfs_btnum_t);
extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int);
extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int);
extern xfs_extlen_t xfs_allocbt_calc_size(struct xfs_mount *mp,
		unsigned long long len);


#endif	/* __XFS_ALLOC_BTREE_H__ */
#endif	/* __XFS_ALLOC_BTREE_H__ */
+9 −0
Original line number Original line Diff line number Diff line
@@ -660,3 +660,12 @@ xfs_bmbt_change_owner(
	xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR);
	xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR);
	return error;
	return error;
}
}

/* Calculate the bmap btree size for some records. */
unsigned long long
xfs_bmbt_calc_size(
	struct xfs_mount	*mp,
	unsigned long long	len)
{
	return xfs_btree_calc_size(mp->m_bmap_dmnr, len);
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -118,4 +118,7 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip,
extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *,
extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *,
		struct xfs_trans *, struct xfs_inode *, int);
		struct xfs_trans *, struct xfs_inode *, int);


extern unsigned long long xfs_bmbt_calc_size(struct xfs_mount *mp,
		unsigned long long len);

#endif	/* __XFS_BMAP_BTREE_H__ */
#endif	/* __XFS_BMAP_BTREE_H__ */
+2 −2
Original line number Original line Diff line number Diff line
@@ -4836,14 +4836,14 @@ xfs_btree_query_all(
 * Calculate the number of blocks needed to store a given number of records
 * Calculate the number of blocks needed to store a given number of records
 * in a short-format (per-AG metadata) btree.
 * in a short-format (per-AG metadata) btree.
 */
 */
xfs_extlen_t
unsigned long long
xfs_btree_calc_size(
xfs_btree_calc_size(
	uint			*limits,
	uint			*limits,
	unsigned long long	len)
	unsigned long long	len)
{
{
	int			level;
	int			level;
	int			maxrecs;
	int			maxrecs;
	xfs_extlen_t		rval;
	unsigned long long	rval;


	maxrecs = limits[0];
	maxrecs = limits[0];
	for (level = 0, rval = 0; len > 1; level++) {
	for (level = 0, rval = 0; len > 1; level++) {
Loading