Message ID | 161214519414.140945.335722903527111632.stgit@magnolia (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | xfs: try harder to reclaim space when we run out | expand |
On Sun, Jan 31, 2021 at 06:06:34PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@kernel.org> > > 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@kernel.org> > Reviewed-by: Christoph Hellwig <hch@lst.de> > --- Reviewed-by: Brian Foster <bfoster@redhat.com> > 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; >
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;