From: Darrick J. Wong <djwong@xxxxxxxxxx> The XFS implementation of the linkat call does not reserve quota for the potential directory expansion. This means that we don't reject the expansion with EDQUOT when we're at or near a hard limit, which means that one can use linkat() to exceed quota. Fix this by adding a quota reservation. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- fs/xfs/xfs_inode.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 04bf467b1090..6e556c9069e8 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1249,6 +1249,10 @@ xfs_link( xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota_nblks(tp, tdp, resblks, 0, false); + if (error) + goto error_return; + error = xfs_iext_count_may_overflow(tdp, XFS_DATA_FORK, XFS_IEXT_DIR_MANIP_CNT(mp)); if (error)