Commit e1429380 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: don't allow overly small or large realtime volumes



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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent cf8f0e6c
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -353,6 +353,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;
}

xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t
		rtextents);
unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp,
@@ -372,6 +384,7 @@ unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp,
# define xfs_rtbuf_cache_relse(a)			(0)
# define xfs_rtalloc_extent_is_free(m,t,s,l,i)		(-ENOSYS)
# define xfs_compute_rextslog(rtx)			(0)
# define xfs_validate_rtextents(rtx)			(false)
static inline xfs_filblks_t
xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)
{
+2 −1
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -963,6 +963,8 @@ xfs_growfs_rt(
	 */
	nrextents = nrblocks;
	do_div(nrextents, in->extsize);
	if (!xfs_validate_rtextents(nrextents))
		return -EINVAL;
	nrbmblocks = xfs_rtbitmap_blockcount(mp, nrextents);
	nrextslog = xfs_compute_rextslog(nrextents);
	nrsumlevels = nrextslog + 1;