xfs: push perags through the ag reservation callouts
authorDave Chinner <dchinner@redhat.com>
Wed, 2 Jun 2021 00:48:24 +0000 (10:48 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 2 Jun 2021 00:48:24 +0000 (10:48 +1000)
We currently pass an agno from the AG reservation functions to the
individual feature accounting functions, which in future may have to
do perag lookups to access per-AG state. Instead, pre-emptively
plumb the perag through from the highest AG reservation layer to the
feature callouts so they won't have to look it up again.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/libxfs/xfs_ag_resv.c
fs/xfs/libxfs/xfs_ialloc_btree.c
fs/xfs/libxfs/xfs_ialloc_btree.h
fs/xfs/libxfs/xfs_refcount_btree.c
fs/xfs/libxfs/xfs_refcount_btree.h
fs/xfs/libxfs/xfs_rmap_btree.c
fs/xfs/libxfs/xfs_rmap_btree.h

index 2e3dcdf..f7394a8 100644 (file)
@@ -250,7 +250,6 @@ xfs_ag_resv_init(
        struct xfs_trans                *tp)
 {
        struct xfs_mount                *mp = pag->pag_mount;
-       xfs_agnumber_t                  agno = pag->pag_agno;
        xfs_extlen_t                    ask;
        xfs_extlen_t                    used;
        int                             error = 0, error2;
@@ -260,11 +259,11 @@ xfs_ag_resv_init(
        if (pag->pag_meta_resv.ar_asked == 0) {
                ask = used = 0;
 
-               error = xfs_refcountbt_calc_reserves(mp, tp, agno, &ask, &used);
+               error = xfs_refcountbt_calc_reserves(mp, tp, pag, &ask, &used);
                if (error)
                        goto out;
 
-               error = xfs_finobt_calc_reserves(mp, tp, agno, &ask, &used);
+               error = xfs_finobt_calc_reserves(mp, tp, pag, &ask, &used);
                if (error)
                        goto out;
 
@@ -282,7 +281,7 @@ xfs_ag_resv_init(
 
                        mp->m_finobt_nores = true;
 
-                       error = xfs_refcountbt_calc_reserves(mp, tp, agno, &ask,
+                       error = xfs_refcountbt_calc_reserves(mp, tp, pag, &ask,
                                        &used);
                        if (error)
                                goto out;
@@ -300,7 +299,7 @@ xfs_ag_resv_init(
        if (pag->pag_rmapbt_resv.ar_asked == 0) {
                ask = used = 0;
 
-               error = xfs_rmapbt_calc_reserves(mp, tp, agno, &ask, &used);
+               error = xfs_rmapbt_calc_reserves(mp, tp, pag, &ask, &used);
                if (error)
                        goto out;
 
index 4c58316..4ec8ea1 100644 (file)
@@ -20,6 +20,7 @@
 #include "xfs_trace.h"
 #include "xfs_trans.h"
 #include "xfs_rmap.h"
+#include "xfs_ag.h"
 
 STATIC int
 xfs_inobt_get_minrecs(
@@ -680,7 +681,7 @@ static int
 xfs_inobt_count_blocks(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
-       xfs_agnumber_t          agno,
+       struct xfs_perag        *pag,
        xfs_btnum_t             btnum,
        xfs_extlen_t            *tree_blocks)
 {
@@ -688,7 +689,7 @@ xfs_inobt_count_blocks(
        struct xfs_btree_cur    *cur = NULL;
        int                     error;
 
-       error = xfs_inobt_cur(mp, tp, agno, btnum, &cur, &agbp);
+       error = xfs_inobt_cur(mp, tp, pag->pag_agno, btnum, &cur, &agbp);
        if (error)
                return error;
 
@@ -704,14 +705,14 @@ static int
 xfs_finobt_read_blocks(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
-       xfs_agnumber_t          agno,
+       struct xfs_perag        *pag,
        xfs_extlen_t            *tree_blocks)
 {
        struct xfs_buf          *agbp;
        struct xfs_agi          *agi;
        int                     error;
 
-       error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
+       error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, &agbp);
        if (error)
                return error;
 
@@ -728,7 +729,7 @@ int
 xfs_finobt_calc_reserves(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
-       xfs_agnumber_t          agno,
+       struct xfs_perag        *pag,
        xfs_extlen_t            *ask,
        xfs_extlen_t            *used)
 {
@@ -739,14 +740,14 @@ xfs_finobt_calc_reserves(
                return 0;
 
        if (xfs_sb_version_hasinobtcounts(&mp->m_sb))
-               error = xfs_finobt_read_blocks(mp, tp, agno, &tree_len);
+               error = xfs_finobt_read_blocks(mp, tp, pag, &tree_len);
        else
-               error = xfs_inobt_count_blocks(mp, tp, agno, XFS_BTNUM_FINO,
+               error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO,
                                &tree_len);
        if (error)
                return error;
 
-       *ask += xfs_inobt_max_size(mp, agno);
+       *ask += xfs_inobt_max_size(mp, pag->pag_agno);
        *used += tree_len;
        return 0;
 }
index 35bbd97..d5afe01 100644 (file)
@@ -64,7 +64,7 @@ int xfs_inobt_rec_check_count(struct xfs_mount *,
 #endif /* DEBUG */
 
 int xfs_finobt_calc_reserves(struct xfs_mount *mp, struct xfs_trans *tp,
-               xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used);
+               struct xfs_perag *pag, xfs_extlen_t *ask, xfs_extlen_t *used);
 extern xfs_extlen_t xfs_iallocbt_calc_size(struct xfs_mount *mp,
                unsigned long long len);
 int xfs_inobt_cur(struct xfs_mount *mp, struct xfs_trans *tp,
index b281f0c..c4ddf9d 100644 (file)
@@ -450,7 +450,7 @@ int
 xfs_refcountbt_calc_reserves(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
-       xfs_agnumber_t          agno,
+       struct xfs_perag        *pag,
        xfs_extlen_t            *ask,
        xfs_extlen_t            *used)
 {
@@ -463,8 +463,7 @@ xfs_refcountbt_calc_reserves(
        if (!xfs_sb_version_hasreflink(&mp->m_sb))
                return 0;
 
-
-       error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp);
+       error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp);
        if (error)
                return error;
 
@@ -479,7 +478,7 @@ xfs_refcountbt_calc_reserves(
         * expansion.  We therefore can pretend the space isn't there.
         */
        if (mp->m_sb.sb_logstart &&
-           XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == agno)
+           XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == pag->pag_agno)
                agblocks -= mp->m_sb.sb_logblocks;
 
        *ask += xfs_refcountbt_max_size(mp, agblocks);
index 69dc515..eab1b0c 100644 (file)
@@ -13,6 +13,7 @@
 struct xfs_buf;
 struct xfs_btree_cur;
 struct xfs_mount;
+struct xfs_perag;
 struct xbtree_afakeroot;
 
 /*
@@ -58,7 +59,7 @@ extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp,
                xfs_agblock_t agblocks);
 
 extern int xfs_refcountbt_calc_reserves(struct xfs_mount *mp,
-               struct xfs_trans *tp, xfs_agnumber_t agno, xfs_extlen_t *ask,
+               struct xfs_trans *tp, struct xfs_perag *pag, xfs_extlen_t *ask,
                xfs_extlen_t *used);
 
 void xfs_refcountbt_commit_staged_btree(struct xfs_btree_cur *cur,
index 46a5295..ba2f706 100644 (file)
@@ -595,7 +595,7 @@ int
 xfs_rmapbt_calc_reserves(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
-       xfs_agnumber_t          agno,
+       struct xfs_perag        *pag,
        xfs_extlen_t            *ask,
        xfs_extlen_t            *used)
 {
@@ -608,7 +608,7 @@ xfs_rmapbt_calc_reserves(
        if (!xfs_sb_version_hasrmapbt(&mp->m_sb))
                return 0;
 
-       error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp);
+       error = xfs_alloc_read_agf(mp, tp, pag->pag_agno, 0, &agbp);
        if (error)
                return error;
 
@@ -623,7 +623,7 @@ xfs_rmapbt_calc_reserves(
         * expansion.  We therefore can pretend the space isn't there.
         */
        if (mp->m_sb.sb_logstart &&
-           XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == agno)
+           XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == pag->pag_agno)
                agblocks -= mp->m_sb.sb_logblocks;
 
        /* Reserve 1% of the AG or enough for 1 block per record. */
index 115c345..57fab72 100644 (file)
@@ -57,6 +57,6 @@ extern xfs_extlen_t xfs_rmapbt_max_size(struct xfs_mount *mp,
                xfs_agblock_t agblocks);
 
 extern int xfs_rmapbt_calc_reserves(struct xfs_mount *mp, struct xfs_trans *tp,
-               xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used);
+               struct xfs_perag *pag, xfs_extlen_t *ask, xfs_extlen_t *used);
 
 #endif /* __XFS_RMAP_BTREE_H__ */