mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
		
							parent
							
								
									cf8f0e6c14
								
							
						
					
					
						commit
						e14293803f
					
				
					 3 changed files with 17 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue