On Sun, Jan 31, 2021 at 06:06:34PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > If a fs modification (creation, file write, reflink, etc.) is unable to > reserve enough space to handle the modification, try clearing whatever > space the filesystem might have been hanging onto in the hopes of > speeding up the filesystem. The flushing behavior will become > particularly important when we add deferred inode inactivation because > that will increase the amount of space that isn't actively tied to user > data. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_trans.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 3203841ab19b..973354647298 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -289,6 +289,17 @@ xfs_trans_alloc( > tp->t_firstblock = NULLFSBLOCK; > > error = xfs_trans_reserve(tp, resp, blocks, rtextents); > + if (error == -ENOSPC) { > + /* > + * We weren't able to reserve enough space for the transaction. > + * Flush the other speculative space allocations to free space. > + * Do not perform a synchronous scan because callers can hold > + * other locks. > + */ > + error = xfs_blockgc_free_space(mp, NULL); > + if (!error) > + error = xfs_trans_reserve(tp, resp, blocks, rtextents); > + } > if (error) { > xfs_trans_cancel(tp); > return error; >