rgd->rd_free = be32_to_cpu(rgd->rd_rgl->rl_free);
        rgrp_set_bitmap_flags(rgd);
        rgd->rd_free_clone = rgd->rd_free;
+       /* max out the rgrp allocation failure point */
+       rgd->rd_extfail_pt = rgd->rd_free;
        rgd->rd_dinodes = be32_to_cpu(rgd->rd_rgl->rl_dinodes);
        rgd->rd_igeneration = be64_to_cpu(rgd->rd_rgl->rl_igeneration);
        return 0;
         * If we have a minimum extent length, then skip over any extent
         * which is less than the min extent length in size.
         */
-       if (minext) {
+       if (minext > 1) {
                extlen = gfs2_free_extlen(rbm, minext);
                if (extlen <= maxext->len)
                        goto fail;
  * gfs2_rbm_find - Look for blocks of a particular state
  * @rbm: Value/result starting position and final position
  * @state: The state which we want to find
- * @minext: Pointer to the requested extent length (NULL for a single block)
+ * @minext: Pointer to the requested extent length
  *          This is updated to be the actual reservation size.
  * @ip: If set, check for reservations
  * @nowrap: Stop looking at the end of the rgrp, rather than wrapping
                if (ip == NULL)
                        return 0;
 
-               ret = gfs2_reservation_check_and_update(rbm, ip,
-                                                       minext ? *minext : 0,
+               ret = gfs2_reservation_check_and_update(rbm, ip, *minext,
                                                        &maxext);
                if (ret == 0)
                        return 0;
                        break;
        }
 
-       if (minext == NULL || state != GFS2_BLKST_FREE)
+       if (state != GFS2_BLKST_FREE)
                return -ENOSPC;
 
        /* If the extent was too small, and it's smaller than the smallest
           useless to search this rgrp again for this amount or more. */
        if (wrapped && (scan_from_start || rbm->bii > last_bii) &&
            *minext < rbm->rgd->rd_extfail_pt)
-               rbm->rgd->rd_extfail_pt = *minext;
+               rbm->rgd->rd_extfail_pt = *minext - 1;
 
        /* If the maximum extent we found is big enough to fulfill the
           minimum requirements, use it anyway. */
        struct buffer_head *dibh;
        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, NULL, ip, false);
+       error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, ip, false);
 
        if (error == -ENOSPC) {
                gfs2_set_alloc_start(&rbm, ip, dinode);
-               error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, NULL, NULL, false);
+               error = gfs2_rbm_find(&rbm, GFS2_BLKST_FREE, &minext, NULL, false);
        }
 
        /* Since all blocks are reserved in advance, this shouldn't happen */