| From f77db9d002f72f8ef1f6d6a8097e856f0976d77a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 15 Jul 2020 18:44:50 -0700 |
| Subject: xfs: fix inode allocation block res calculation precedence |
| |
| From: Brian Foster <bfoster@redhat.com> |
| |
| [ Upstream commit b2a8864728683443f34a9fd33a2b78b860934cc1 ] |
| |
| 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@redhat.com> |
| Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| 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 88221c7a04ccf..c6df01a2a1585 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))) |
| |
| /* |
| -- |
| 2.25.1 |
| |