Re: [PATCH] xfs: fix inode allocation block res calculation precedence

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 16, 2020 at 08:29:35AM +1000, Dave Chinner wrote:
> On Wed, Jul 15, 2020 at 03:33:10PM -0400, Brian Foster wrote:
> > The block reservation calculation for inode allocation is supposed
> > to consist of the blocks required for the inode chunk plus
> > (maxlevels-1) of the inode btree multiplied by the number of inode
> > btrees in the fs (2 when finobt is enabled, 1 otherwise).
> > 
> > Instead, the macro returns (ialloc_blocks + 2) due to a precedence
> > error in the calculation logic. This leads to block reservation
> > overruns via generic/531 on small block filesystems with finobt
> > enabled. Add braces to fix the calculation and reserve the
> > appropriate number of blocks.
> > 
> > Fixes: 9d43b180af67 ("xfs: update inode allocation/free transaction reservations for finobt")
> > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx>
> > ---
> >  fs/xfs/libxfs/xfs_trans_space.h | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/fs/xfs/libxfs/xfs_trans_space.h b/fs/xfs/libxfs/xfs_trans_space.h
> > index 88221c7a04cc..c6df01a2a158 100644
> > --- a/fs/xfs/libxfs/xfs_trans_space.h
> > +++ b/fs/xfs/libxfs/xfs_trans_space.h
> > @@ -57,7 +57,7 @@
> >  	XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK)
> >  #define	XFS_IALLOC_SPACE_RES(mp)	\
> >  	(M_IGEO(mp)->ialloc_blks + \
> > -	 (xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1 * \
> > +	 ((xfs_sb_version_hasfinobt(&mp->m_sb) ? 2 : 1) * \
> >  	  (M_IGEO(mp)->inobt_maxlevels - 1)))
> 
> Ugh. THese macros really need rewriting as static inline functions.
> This would not have happened if it were written as:
> 
> static inline int
> xfs_ialloc_space_res(struct xfs_mount *mp)
> {
> 	int	res = M_IGEO(mp)->ialloc_blks;
> 
> 	res += M_IGEO(mp)->inobt_maxlevels - 1;
> 	if (xfs_sb_version_hasfinobt(&mp->m_sb))
> 		res += M_IGEO(mp)->inobt_maxlevels - 1;
> 	return res;
> }
> 
> Next question: why is this even a macro that is calculated on demand
> instead of a read-only constant held in inode geometry calculated
> at mount time? Then it doesn't even need to be an inline function
> and can just be rolled into xfs_ialloc_setup_geometry()....

Yeah, I hate those macros too.  Fixing all that sounds like a <cough>
cleanup series for someone, but in the meantime this is easy enough to
backport to stable kernels.

Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>

--D

> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@xxxxxxxxxxxxx



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux