Don't clear space of the whole fs when the project quota limit is reached, since it affects the writing performance of files of the directories that are under quota. Only run cow/eofblocks scans on the quota attached to the inode. Signed-off-by: Jian Wen <wenjian1@xxxxxxxxxx> --- fs/xfs/xfs_file.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index e33e5e13b95f..4fbe262d33cc 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -24,6 +24,9 @@ #include "xfs_pnfs.h" #include "xfs_iomap.h" #include "xfs_reflink.h" +#include "xfs_quota.h" +#include "xfs_dquot_item.h" +#include "xfs_dquot.h" #include <linux/dax.h> #include <linux/falloc.h> @@ -803,8 +806,18 @@ xfs_file_buffered_write( goto write_retry; } else if (ret == -ENOSPC && !cleared_space) { struct xfs_icwalk icw = {0}; + struct xfs_dquot *pdqp = ip->i_pdquot; cleared_space = true; + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount) && + pdqp && xfs_dquot_lowsp(pdqp)) { + xfs_iunlock(ip, iolock); + icw.icw_prid = pdqp->q_id; + icw.icw_flags |= XFS_ICWALK_FLAG_PRID; + xfs_blockgc_free_space(ip->i_mount, &icw); + goto write_retry; + } + xfs_flush_inodes(ip->i_mount); xfs_iunlock(ip, iolock); -- 2.34.1