]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: push perags through the ag reservation callouts
authorDave Chinner <dchinner@redhat.com>
Fri, 15 Oct 2021 20:28:25 +0000 (16:28 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 15 Oct 2021 20:28:25 +0000 (16:28 -0400)
Source kernel commit: 30933120ad79f4549d6e364df7eda474cc0d9c65

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>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/info.c
libxfs/xfs_ag_resv.c
libxfs/xfs_ialloc_btree.c
libxfs/xfs_ialloc_btree.h
libxfs/xfs_refcount_btree.c
libxfs/xfs_refcount_btree.h
libxfs/xfs_rmap_btree.c
libxfs/xfs_rmap_btree.h

index 2731446da699a06a03393be21bb9a4f3eedb3be8..6c5c3e5b52fc55bf8b6c8a9afa6deb37b37d33e8 100644 (file)
--- a/db/info.c
+++ b/db/info.c
@@ -66,19 +66,20 @@ print_agresv_info(
 {
        struct xfs_buf  *bp;
        struct xfs_agf  *agf;
+       struct xfs_perag *pag = xfs_perag_get(mp, agno);
        xfs_extlen_t    ask = 0;
        xfs_extlen_t    used = 0;
        xfs_extlen_t    free = 0;
        xfs_extlen_t    length = 0;
        int             error;
 
-       error = -libxfs_refcountbt_calc_reserves(mp, NULL, agno, &ask, &used);
+       error = -libxfs_refcountbt_calc_reserves(mp, NULL, pag, &ask, &used);
        if (error)
                xfrog_perror(error, "refcountbt");
-       error = -libxfs_finobt_calc_reserves(mp, NULL, agno, &ask, &used);
+       error = -libxfs_finobt_calc_reserves(mp, NULL, pag, &ask, &used);
        if (error)
                xfrog_perror(error, "finobt");
-       error = -libxfs_rmapbt_calc_reserves(mp, NULL, agno, &ask, &used);
+       error = -libxfs_rmapbt_calc_reserves(mp, NULL, pag, &ask, &used);
        if (error)
                xfrog_perror(error, "rmapbt");
 
@@ -96,6 +97,7 @@ print_agresv_info(
        if (ask - used > free)
                printf(" <not enough space>");
        printf("\n");
+       xfs_perag_put(pag);
 }
 
 static int
index 34ab68c09716ceab193f921eea21dcecf2da29a8..b1392cda1c39d7dce9f5e7d0d5e4beb437129204 100644 (file)
@@ -249,7 +249,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;
@@ -259,11 +258,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;
 
@@ -281,7 +280,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;
@@ -299,7 +298,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 3f0512b2f00f4821cb1f16f1c8e7f197e2398b9e..e93843e25a18b6dac6bd0a8990bff86deda35363 100644 (file)
@@ -19,6 +19,7 @@
 #include "xfs_trace.h"
 #include "xfs_trans.h"
 #include "xfs_rmap.h"
+#include "xfs_ag.h"
 
 STATIC int
 xfs_inobt_get_minrecs(
@@ -679,7 +680,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)
 {
@@ -687,7 +688,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;
 
@@ -703,14 +704,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;
 
@@ -727,7 +728,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)
 {
@@ -738,14 +739,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 35bbd978c27254ecf67374414d11995b07d301e7..d5afe01fb2deb5985b0f48bf69f21566b2507761 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 5344b282d09d38d38ff903890dd9ab21a0b69786..e23ea313b5b118ecfcdd018555ae635a1c40a5f7 100644 (file)
@@ -449,7 +449,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)
 {
@@ -462,8 +462,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;
 
@@ -478,7 +477,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 69dc515db671d950f23ac1b4f8d2b3824b5724b2..eab1b0c672c00333a0f9f411bdb32701a6334b2a 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 7abca87e48aa051d92197e6cc00f4aaf5245f582..c8cac84f6b82b38af097b275527ada95fc890c9d 100644 (file)
@@ -593,7 +593,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)
 {
@@ -606,7 +606,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;
 
@@ -621,7 +621,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 35b81fc8a018cd7309c15e1c9a31c53e033fb3ca..cef361a10aaf116072badad66a0f867824ce2e99 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__ */