]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: don't allow overly small or large realtime volumes
authorDarrick J. Wong <djwong@kernel.org>
Wed, 27 Mar 2024 00:12:19 +0000 (17:12 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:28:47 +0000 (15:28 +0200)
commit e14293803f4e84eb23a417b462b56251033b5a66 upstream.

[backport: resolve merge conflicts due to refactoring rtbitmap/summary
macros and accessors]

Don't allow realtime volumes that are less than one rt extent long.
This has been broken across 4 LTS kernels with nobody noticing, so let's
just disable it.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/libxfs/xfs_rtbitmap.h
fs/xfs/libxfs/xfs_sb.c
fs/xfs/xfs_rtalloc.c

index 6becdc7a48ede41d568232bf3e71c288cc1794a9..4e49aadf0955d77e8ade466eb47e81fad2b18ef8 100644 (file)
@@ -73,6 +73,18 @@ int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno,
 
 uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents);
 
+/* Do we support an rt volume having this number of rtextents? */
+static inline bool
+xfs_validate_rtextents(
+       xfs_rtbxlen_t           rtextents)
+{
+       /* No runt rt volumes */
+       if (rtextents == 0)
+               return false;
+
+       return true;
+}
+
 #else /* CONFIG_XFS_RT */
 # define xfs_rtfree_extent(t,b,l)                      (-ENOSYS)
 # define xfs_rtfree_blocks(t,rb,rl)                    (-ENOSYS)
@@ -81,6 +93,7 @@ uint8_t xfs_compute_rextslog(xfs_rtbxlen_t rtextents);
 # define xfs_rtbuf_get(m,t,b,i,p)                      (-ENOSYS)
 # define xfs_rtalloc_extent_is_free(m,t,s,l,i)         (-ENOSYS)
 # define xfs_compute_rextslog(rtx)                     (0)
+# define xfs_validate_rtextents(rtx)                   (false)
 #endif /* CONFIG_XFS_RT */
 
 #endif /* __XFS_RTBITMAP_H__ */
index 25eec54f9bb2b5c9b86d0e6a7e9fe750b0ebb8db..acba0694abf43907d1fe4d8cbc573027ca1119d6 100644 (file)
@@ -509,7 +509,8 @@ xfs_validate_sb_common(
                rbmblocks = howmany_64(sbp->sb_rextents,
                                       NBBY * sbp->sb_blocksize);
 
-               if (sbp->sb_rextents != rexts ||
+               if (!xfs_validate_rtextents(rexts) ||
+                   sbp->sb_rextents != rexts ||
                    sbp->sb_rextslog != xfs_compute_rextslog(rexts) ||
                    sbp->sb_rbmblocks != rbmblocks) {
                        xfs_notice(mp,
index 5fbe5e33c4253feea4fb9120ca5eac689d3f0ec1..e5d6031d47bb8ec9ccaac904d7abaee84a9d0699 100644 (file)
@@ -998,6 +998,8 @@ xfs_growfs_rt(
         */
        nrextents = nrblocks;
        do_div(nrextents, in->extsize);
+       if (!xfs_validate_rtextents(nrextents))
+               return -EINVAL;
        nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize);
        nrextslog = xfs_compute_rextslog(nrextents);
        nrsumlevels = nrextslog + 1;