gfs2: Don't search for unreserved space twice
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 12 Oct 2020 15:23:50 +0000 (17:23 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Wed, 17 Feb 2021 18:26:05 +0000 (19:26 +0100)
If gfs2_inplace_reserve has chosen a resource group but it couldn't make a
reservation there, there are too many other reservations in that resource
group.  In that case, don't even try to respect existing reservations in
gfs2_alloc_blocks.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/rgrp.c

index deb5536..95ff4a3 100644 (file)
@@ -2384,11 +2384,12 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
        struct gfs2_rbm rbm = { .rgd = ip->i_res.rs_rgd, };
        u64 block; /* block, within the file system scope */
        u32 minext = 1;
-       int error;
-
-       gfs2_set_alloc_start(&rbm, ip, dinode);
-       error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, &ip->i_res, false);
+       int error = -ENOSPC;
 
+       if (gfs2_rs_active(&ip->i_res)) {
+               gfs2_set_alloc_start(&rbm, ip, dinode);
+               error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, &ip->i_res, false);
+       }
        if (error == -ENOSPC) {
                gfs2_set_alloc_start(&rbm, ip, dinode);
                error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, NULL, false);