]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: inode allocation can use a single perag instance
authorDave Chinner <dchinner@redhat.com>
Fri, 15 Oct 2021 20:28:26 +0000 (16:28 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 15 Oct 2021 20:28:26 +0000 (16:28 -0400)
Source kernel commit: 309161f6603ce1a53b76a42817cde2a9bcd17e82

Now that we've internalised the two-phase inode allocation, we can
now easily make the AG selection and allocation atomic from the
perspective of a single perag context. This will ensure AGs going
offline/away cannot occur between the selection and allocation
steps.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_ialloc.c

index b133b2edf1f6872a0385cac98d06cd3b9a7bdbf3..60e09a531098eea61d8082580c0337d2dc7b517e 100644 (file)
@@ -1427,6 +1427,7 @@ static int
 xfs_dialloc_ag(
        struct xfs_trans        *tp,
        struct xfs_buf          *agbp,
+       struct xfs_perag        *pag,
        xfs_ino_t               parent,
        xfs_ino_t               *inop)
 {
@@ -1441,7 +1442,6 @@ xfs_dialloc_ag(
        int                             error;
        int                             offset;
        int                             i;
-       struct xfs_perag                *pag = agbp->b_pag;
 
        if (!xfs_sb_version_hasfinobt(&mp->m_sb))
                return xfs_dialloc_ag_inobt(tp, agbp, pag, parent, inop);
@@ -1758,9 +1758,9 @@ nextag:
        xfs_perag_put(pag);
        return error ? error : -ENOSPC;
 found_ag:
-       xfs_perag_put(pag);
        /* Allocate an inode in the found AG */
-       error = xfs_dialloc_ag(*tpp, agbp, parent, &ino);
+       error = xfs_dialloc_ag(*tpp, agbp, pag, parent, &ino);
+       xfs_perag_put(pag);
        if (error)
                return error;
        *new_ino = ino;