On Wed, Apr 18, 2018 at 09:31:16AM -0400, Brian Foster wrote: > Now that AGFL block frees are deferred when dfops is set in the > transaction, start deferring AGFL block frees from contexts that are > known to push the limits of existing log reservations. > > The first such context is deferred operation processing itself. This > primarily targets deferred extent frees (such as file extents and > inode chunks), but in doing so covers all allocation operations that > occur in deferred operation processing context. > > Update xfs_defer_finish() to set and reset ->t_agfl_dfops across the > processing sequence. This means that any AGFL block frees due to > allocation events result in the addition of new EFIs to the dfops > rather than being processed immediately. xfs_defer_finish() rolls > the transaction at least once more to process the frees of the AGFL > blocks back to the allocation btrees and returns once the AGFL is > rectified. > > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> Looks ok, will test... Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_defer.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c > index 087fea02c389..4d87d9661907 100644 > --- a/fs/xfs/libxfs/xfs_defer.c > +++ b/fs/xfs/libxfs/xfs_defer.c > @@ -352,11 +352,22 @@ xfs_defer_finish( > void *state; > int error = 0; > void (*cleanup_fn)(struct xfs_trans *, void *, int); > + struct xfs_defer_ops *orig_dop; > > ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > > trace_xfs_defer_finish((*tp)->t_mountp, dop); > > + /* > + * Attach dfops to the transaction during deferred ops processing. This > + * explicitly causes calls into the allocator to defer AGFL block frees. > + * Note that this code can go away once all dfops users attach to the > + * associated tp. > + */ > + ASSERT(!(*tp)->t_agfl_dfops || ((*tp)->t_agfl_dfops == dop)); > + orig_dop = (*tp)->t_agfl_dfops; > + (*tp)->t_agfl_dfops = dop; > + > /* Until we run out of pending work to finish... */ > while (xfs_defer_has_unfinished_work(dop)) { > /* Log intents for work items sitting in the intake. */ > @@ -428,6 +439,7 @@ xfs_defer_finish( > } > > out: > + (*tp)->t_agfl_dfops = orig_dop; > if (error) > trace_xfs_defer_finish_error((*tp)->t_mountp, dop, error); > else > -- > 2.13.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html