]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: don't scan off the end of the rt volume in xfs_rtallocate_extent_block
authorDarrick J. Wong <djwong@kernel.org>
Fri, 28 Jun 2024 16:08:07 +0000 (09:08 -0700)
committerChristoph Hellwig <hch@lst.de>
Mon, 5 Aug 2024 18:50:00 +0000 (11:50 -0700)
The loop conditional here is not quite correct because an rtbitmap block
can represent rtextents beyond the end of the rt volume.  There's no way
that it makes sense to scan for free space beyond EOFS, so don't do it.
This overrun has been present since v2.6.0.

Also fix the type of bestlen, which was incorrectly converted.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_rtalloc.c

index ef5118210545fa784573fed6dbeca419ef626290..e7158ed991826dd0214bbd15bf297f680339e8a2 100644 (file)
@@ -231,22 +231,20 @@ xfs_rtallocate_extent_block(
        xfs_rtxnum_t            *rtx)   /* out: start rtext allocated */
 {
        struct xfs_mount        *mp = args->mp;
-       xfs_rtxnum_t            besti;  /* best rtext found so far */
-       xfs_rtxnum_t            bestlen;/* best length found so far */
+       xfs_rtxnum_t            besti = -1; /* best rtext found so far */
        xfs_rtxnum_t            end;    /* last rtext in chunk */
-       int                     error;
        xfs_rtxnum_t            i;      /* current rtext trying */
        xfs_rtxnum_t            next;   /* next rtext to try */
+       xfs_rtxlen_t            bestlen = 0; /* best length found so far */
        int                     stat;   /* status from internal calls */
+       int                     error;
 
        /*
-        * Loop over all the extents starting in this bitmap block,
-        * looking for one that's long enough.
+        * Loop over all the extents starting in this bitmap block up to the
+        * end of the rt volume, looking for one that's long enough.
         */
-       for (i = xfs_rbmblock_to_rtx(mp, bbno), besti = -1, bestlen = 0,
-               end = xfs_rbmblock_to_rtx(mp, bbno + 1) - 1;
-            i <= end;
-            i++) {
+       end = min(mp->m_sb.sb_rextents, xfs_rbmblock_to_rtx(mp, bbno + 1)) - 1;
+       for (i = xfs_rbmblock_to_rtx(mp, bbno); i <= end; i++) {
                /* Make sure we don't scan off the end of the rt volume. */
                maxlen = xfs_rtallocate_clamp_len(mp, i, maxlen, prod);