]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: add helpers to calculate btree size
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 28 Jun 2018 20:11:56 +0000 (15:11 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 28 Jun 2018 20:11:56 +0000 (15:11 -0500)
Source kernel commit: 14861c47400b4a1669956d8b027fe4b7855e39f1

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: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_alloc_btree.c
libxfs/xfs_alloc_btree.h
libxfs/xfs_bmap_btree.c
libxfs/xfs_bmap_btree.h
libxfs/xfs_btree.c
libxfs/xfs_btree.h
libxfs/xfs_ialloc_btree.c
libxfs/xfs_ialloc_btree.h

index 15950cdc38a882cee7119ced6295278e569af6ef..5b81aec002afd685136c33ca6026a6806abad623 100644 (file)
@@ -545,3 +545,12 @@ xfs_allocbt_maxrecs(
                return blocklen / sizeof(xfs_alloc_rec_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);
+}
index 45e189e7e81c31b18a0de124cd4d256407d2a120..2fd54728871ccdf85614bfa7091c2f2cec37b39e 100644 (file)
@@ -61,5 +61,7 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *,
                struct xfs_trans *, struct xfs_buf *,
                xfs_agnumber_t, xfs_btnum_t);
 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__ */
index 5735f9655812a9d69c2a71f481084f50440dbaea..8767e98b91a0fea342de4c664fd7fae4defc2a84 100644 (file)
@@ -657,3 +657,12 @@ xfs_bmbt_change_owner(
        xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR);
        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);
+}
index e4505746ccaa86489b0a96894ff11778253eeb45..fb3cd2d9e0f83af29a8078dd04a32a916743ad6c 100644 (file)
@@ -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 *,
                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__ */
index 0ccf4f1d135858d53f12b11ad61d5fa45f194ab3..f7dc567198f1816ebd45f51aedaab4d8c86bc581 100644 (file)
@@ -4836,14 +4836,14 @@ xfs_btree_query_all(
  * Calculate the number of blocks needed to store a given number of records
  * in a short-format (per-AG metadata) btree.
  */
-xfs_extlen_t
+unsigned long long
 xfs_btree_calc_size(
        uint                    *limits,
        unsigned long long      len)
 {
        int                     level;
        int                     maxrecs;
-       xfs_extlen_t            rval;
+       unsigned long long      rval;
 
        maxrecs = limits[0];
        for (level = 0, rval = 0; len > 1; level++) {
index eb25d70e88416d4a41b044d9d8a5cbb0227a978c..d870dbfcd613fd00d3a7107db966b79471e85119 100644 (file)
@@ -482,7 +482,7 @@ xfs_failaddr_t xfs_btree_lblock_verify(struct xfs_buf *bp,
                unsigned int max_recs);
 
 uint xfs_btree_compute_maxlevels(uint *limits, unsigned long len);
-xfs_extlen_t xfs_btree_calc_size(uint *limits, unsigned long long len);
+unsigned long long xfs_btree_calc_size(uint *limits, unsigned long long len);
 
 /* return codes */
 #define XFS_BTREE_QUERY_RANGE_CONTINUE 0       /* keep iterating */
index 8c467c9ee6b6729aa804b6b822d424aeca073944..3efa769c3a79ad4bcc6ef52a869de79deda13517 100644 (file)
@@ -607,3 +607,12 @@ xfs_finobt_calc_reserves(
        *used += tree_len;
        return 0;
 }
+
+/* Calculate the inobt btree size for some records. */
+xfs_extlen_t
+xfs_iallocbt_calc_size(
+       struct xfs_mount        *mp,
+       unsigned long long      len)
+{
+       return xfs_btree_calc_size(mp->m_inobt_mnr, len);
+}
index aa81e2e63f3f95da8434798e8b2bf6501491eac3..4acdd5458d59f17fe7086ecb3058fbc716d91a11 100644 (file)
@@ -74,5 +74,7 @@ int xfs_inobt_rec_check_count(struct xfs_mount *,
 
 int xfs_finobt_calc_reserves(struct xfs_mount *mp, xfs_agnumber_t agno,
                xfs_extlen_t *ask, xfs_extlen_t *used);
+extern xfs_extlen_t xfs_iallocbt_calc_size(struct xfs_mount *mp,
+               unsigned long long len);
 
 #endif /* __XFS_IALLOC_BTREE_H__ */