On Thu, Dec 14, 2023 at 11:07:08PM +0800, Jian Wen wrote: > 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)) { Do not align the if test code with the body. > + 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); This is an open-coded version of the xfs_blockgc_free_quota above. The decision-making is complex enough to warrant a helper predicate: static inline bool want_blockgc_free_quota(struct xfs_inode *ip, int ret) { if (ret == -EDQUOT) return true; if (ret != -ENOSPC) return false; if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount) && ip->i_pdquot && xfs_dquot_lowsp(ip->i_pdquot)) return true; return false; } if (want_blockgc_free_quota(ip, ret) && !cleared_space) { xfs_iunlock(ip, iolock); xfs_blockgc_free_quota(ip, XFS_ICWALK_FLAG_SYNC); cleared_space = true; goto write_retry; } else if (ret == -ENOSPC && !cleared_space) { --D > + goto write_retry; > + } > + > xfs_flush_inodes(ip->i_mount); > > xfs_iunlock(ip, iolock); > -- > 2.34.1 > >