]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: insert the pag structures into the xarray later
authorChristoph Hellwig <hch@lst.de>
Mon, 4 Nov 2024 04:18:37 +0000 (20:18 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 5 Nov 2024 21:38:27 +0000 (13:38 -0800)
Cleaning up is much easier if a structure can't be looked up yet, so only
insert the pag once it is fully set up.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_ag.c

index 3e232b3d4c4262010f9288137b5d5e8da8ac75e0..d51e88a4e7e28346b742f6ba92b46a8e509c7bec 100644 (file)
@@ -307,15 +307,6 @@ xfs_perag_alloc(
        if (!pag)
                return -ENOMEM;
 
-       pag->pag_agno = index;
-       pag->pag_mount = mp;
-
-       error = xa_insert(&mp->m_perags, index, pag, GFP_KERNEL);
-       if (error) {
-               WARN_ON_ONCE(error == -EBUSY);
-               goto out_free_pag;
-       }
-
 #ifdef __KERNEL__
        /* Place kernel structure only init below this point. */
        spin_lock_init(&pag->pag_ici_lock);
@@ -331,10 +322,7 @@ xfs_perag_alloc(
 
        error = xfs_buf_cache_init(&pag->pag_bcache);
        if (error)
-               goto out_remove_pag;
-
-       /* Active ref owned by mount indicates AG is online. */
-       atomic_set(&pag->pag_active_ref, 1);
+               goto out_defer_drain_free;
 
        /*
         * Pre-calculated geometry
@@ -344,12 +332,23 @@ xfs_perag_alloc(
        __xfs_agino_range(mp, pag->block_count, &pag->agino_min,
                        &pag->agino_max);
 
+       pag->pag_agno = index;
+       pag->pag_mount = mp;
+       /* Active ref owned by mount indicates AG is online. */
+       atomic_set(&pag->pag_active_ref, 1);
+
+       error = xa_insert(&mp->m_perags, index, pag, GFP_KERNEL);
+       if (error) {
+               WARN_ON_ONCE(error == -EBUSY);
+               goto out_buf_cache_destroy;
+       }
+
        return 0;
 
-out_remove_pag:
+out_buf_cache_destroy:
+       xfs_buf_cache_destroy(&pag->pag_bcache);
+out_defer_drain_free:
        xfs_defer_drain_free(&pag->pag_intents_drain);
-       pag = xa_erase(&mp->m_perags, index);
-out_free_pag:
        kfree(pag);
        return error;
 }