]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: skip small alloc cntbt logic on NULL cursor
authorBrian Foster <bfoster@redhat.com>
Wed, 28 Aug 2019 16:08:08 +0000 (12:08 -0400)
committerEric Sandeen <sandeen@redhat.com>
Wed, 28 Aug 2019 16:08:08 +0000 (12:08 -0400)
Source kernel commit: 6691cd9267c1c588d1f8e097c175d7c9670c7fc1

The small allocation helper is implemented in a way that is fairly
tightly integrated to the existing allocation algorithms. It expects
a cntbt cursor beyond the end of the tree, attempts to locate the
last record in the tree and only attempts an AGFL allocation if the
cntbt is empty.

The upcoming generic algorithm doesn't rely on the cntbt processing
of this function. It will only call this function when the cntbt
doesn't have a big enough extent or is empty and thus AGFL
allocation is the only remaining option. Tweak
xfs_alloc_ag_vextent_small() to handle a NULL cntbt cursor and skip
the cntbt logic. This facilitates use by the existing allocation
code and new code that only requires an AGFL allocation attempt.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_alloc.c

index 6692c4e4baf52efceaf2192fed94f529d02ef362..6e5d02c8fbbc18bbd7f3af80c27542acce75eaef 100644 (file)
@@ -709,9 +709,16 @@ xfs_alloc_ag_vextent_small(
        int                     error = 0;
        xfs_agblock_t           fbno = NULLAGBLOCK;
        xfs_extlen_t            flen = 0;
-       int                     i;
+       int                     i = 0;
 
-       error = xfs_btree_decrement(ccur, 0, &i);
+       /*
+        * If a cntbt cursor is provided, try to allocate the largest record in
+        * the tree. Try the AGFL if the cntbt is empty, otherwise fail the
+        * allocation. Make sure to respect minleft even when pulling from the
+        * freelist.
+        */
+       if (ccur)
+               error = xfs_btree_decrement(ccur, 0, &i);
        if (error)
                goto error;
        if (i) {