Skip to content

xfs: broad enablement of deferred agfl frees

Brian Foster linux-xfs 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest24 patches 59 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/24xfs: cow unwritten conversion uses uninitialized dfopsfs/xfs/xfs_reflink.c+4 -77 replies
2/24xfs: rename xfs_trans ->t_agfl_dfops to ->t_dfopsfs/xfs/libxfs/xfs_alloc.c fs/xfs/libxfs/xfs_defer.c fs/xfs/xfs_inode.c +3 more+16 -162 replies
3/24xfs: remove dfops parameter from ifree call stackfs/xfs/libxfs/xfs_ialloc.c fs/xfs/libxfs/xfs_ialloc.h fs/xfs/xfs_inode.c +1 more+7 -122 replies
4/24xfs: remove dfops param from high level dirname callsfs/xfs/libxfs/xfs_dir2.c fs/xfs/libxfs/xfs_dir2.h fs/xfs/xfs_inode.c +1 more+35 -424 replies
5/24xfs: use ->t_dfops for recovery of [b|c]ui log itemsfs/xfs/xfs_bmap_item.c fs/xfs/xfs_refcount_item.c+6 -06 replies
6/24xfs: use ->t_dfops for attr set/remove operationsfs/xfs/libxfs/xfs_attr.c fs/xfs/libxfs/xfs_bmap.c+9 -52 replies
7/24xfs: remove dfops param in attr fork add pathfs/xfs/libxfs/xfs_bmap.c+8 -112 replies
8/24xfs: use ->t_dfops in extent split tx and remove paramfs/xfs/libxfs/xfs_bmap.c+6 -72 replies
9/24xfs: replace xfs_da_args->dfops accesses with ->t_dfops and removefs/xfs/libxfs/xfs_attr.c fs/xfs/libxfs/xfs_attr_leaf.c fs/xfs/libxfs/xfs_attr_remote.c +4 more+117 -1192 replies
10/24xfs: use ->t_dfops in dqalloc transactionfs/xfs/xfs_dquot.c+20 -143 replies
11/24xfs: use ->t_dfops for all xfs_bmapi_write() callersfs/xfs/xfs_bmap_util.c fs/xfs/xfs_iomap.c fs/xfs/xfs_reflink.c +2 more+26 -203 replies
12/24xfs: remove xfs_bmapi_write() dfops paramfs/xfs/libxfs/xfs_attr_remote.c fs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap.h +7 more+20 -252 replies
13/24xfs: use ->t_dfops for all xfs_bunmapi() callersfs/xfs/xfs_bmap_util.c fs/xfs/xfs_inode.c fs/xfs/xfs_reflink.c +1 more+33 -243 replies
14/24xfs: remove xfs_bunmapi() dfops paramfs/xfs/libxfs/xfs_attr_remote.c fs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap.h +6 more+19 -242 replies
15/24xfs: remove xfs_bmapi_remap() dfops paramfs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap.h+5 -52 replies
16/24xfs: remove struct xfs_bmalloca dfops fieldfs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap.h fs/xfs/xfs_filestream.c+17 -172 replies
17/24xfs: use ->t_dfops for collapse/insert range operationsfs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap.h fs/xfs/xfs_bmap_util.c+17 -192 replies
18/24xfs: remove dfops param from internal bmap extent helpersfs/xfs/libxfs/xfs_bmap.c+44 -482 replies
19/24xfs: remove xfs_btree_cur bmbt dfops fieldfs/xfs/libxfs/xfs_bmap.c fs/xfs/libxfs/xfs_bmap_btree.c fs/xfs/libxfs/xfs_btree.h+4 -182 replies
20/24xfs: remove unused btree cursor bc_private.a.dfops fieldfs/xfs/libxfs/xfs_btree.h fs/xfs/libxfs/xfs_refcount.c fs/xfs/libxfs/xfs_refcount_btree.c +4 more+9 -132 replies
21/24xfs: use ->t_dfops for rmap extent swap operationsfs/xfs/xfs_bmap_util.c+19 -133 replies
22/24xfs: use ->t_dfops in cancel cow blocks operationfs/xfs/xfs_reflink.c+8 -62 replies
23/24xfs: use ->t_dfops in reflink cow recover pathfs/xfs/libxfs/xfs_refcount.c+5 -42 replies
24/24xfs: refactor dfops init to attach to transactionfs/xfs/libxfs/xfs_attr.c fs/xfs/libxfs/xfs_attr_remote.c fs/xfs/libxfs/xfs_bmap.c +11 more+55 -702 replies

Reviews trailers per patch

All 24 patches have a Reviewed-by or Acked-by.

PatchDarrick J. WongCarlos MaiolinoChristoph Hellwig
1/24R-b R-b R-b R-b
2/24R-b R-b
3/24R-b R-b
4/24R-b R-b R-b
5/24R-b R-b R-b
6/24R-b R-b
7/24R-b R-b
8/24R-b R-b
9/24R-b R-b
10/24R-b
11/24R-b R-b
12/24R-b R-b
13/24R-b
14/24R-b R-b
15/24R-b R-b
16/24R-b R-b
17/24R-b R-b
18/24R-b R-b
19/24R-b R-b
20/24R-b R-b
21/24R-b R-b
22/24R-b R-b
23/24R-b R-b
24/24R-b R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 3 reviewers.

Read the v1 thread

Cover letter [PATCH 00/24] xfs: broad enablement of deferred agfl frees

Hi all,

Here's the next wave of dfops/xfs_trans related cleanups. This was split off the original series that introduced ->t_agfl_dfops to separate fixing the log reservation problems in those particular codepaths from broader cleanups and generalization of deferred agfl block frees.

The purpose of this series is to 1.) enable deferred AGFL frees for the broader codebase (wherever a dfops is already used) and 2.) clean up the various places dfops is carried through on the stack or via interface structures as the transaction reference is populated.

This work does expose a few warts with how dfops are used in relation to transactions. For example, log recovery uses a dfops as a primary structure and transactions are allocated/committed further down the callchain. In that case, we don't want the transaction to commit the caller's dfops. A few other places receive a transaction and then locally init/finish a dfops on the stack. We have to be careful in these places to not return a transaction to the caller with a dfops reference that points to freed or reused stack memory by the time the tx is committed.

I think these issues can be mostly resolved by the end goal of a combined xfs_trans/xfs_defer_ops structure. Boilerplate code that allocates a transaction, inits a dfops, finishes a dfops and commits the transaction can then reduce to allocating and committing the transaction (where the former and latter respectively init/finish an internal dfops). There are other patterns and issues to consider, however, so that will be a matter for a subsequent patch series. (I'm actually thinking of cleaning up all of the firstblock stuff as a next step in that direction.)

In this series: Patch 1 has been previously posted/reviewed. It is included just as a dependency. Patch 2 renames ->t_agfl_dfops back to ->t_dfops for general purpose use. Patches 3-4 reintroduce some cleanups dropped from the original series (where ->t_dfops is already used). Patches 5-23 enable the use of ->t_dfops for transactions in various subsystems, remove any subsequently unnecessary stack/data structure dfops references and repeat until pretty much every transaction has a dfops reference. Patch 24 refactors xfs_defer_init() to do the transaction association, cleaning up all of the manual assignments added by the previous patches.

I moved the final patch from the beginning to the end because it seemed controversial in the previous posting, for whatever reason. This order more explicitly documents the associated cleanup. Personally, I think the patch should be a requirement for the broad use of ->t_dfops implemented in this series, otherwise it's not clear to the developer that an association needs to be made with the transaction in many codepaths.

Finally, this has so far survived a couple rounds of xfstests with and without rmapbt and reflink enabled. Further testing is ongoing.

Thoughts, reviews, flames appreciated.

Brian

Brian Foster (24):
xfs: cow unwritten conversion uses uninitialized dfops
xfs: rename xfs_trans ->t_agfl_dfops to ->t_dfops
xfs: remove dfops parameter from ifree call stack
xfs: remove dfops param from high level dirname calls
xfs: use ->t_dfops for recovery of [b|c]ui log items
xfs: use ->t_dfops for attr set/remove operations
xfs: remove dfops param in attr fork add path
xfs: use ->t_dfops in extent split tx and remove param
xfs: replace xfs_da_args->dfops accesses with ->t_dfops and remove
xfs: use ->t_dfops in dqalloc transaction
xfs: use ->t_dfops for all xfs_bmapi_write() callers
xfs: remove xfs_bmapi_write() dfops param
xfs: use ->t_dfops for all xfs_bunmapi() callers
xfs: remove xfs_bunmapi() dfops param
xfs: remove xfs_bmapi_remap() dfops param
xfs: remove struct xfs_bmalloca dfops field
xfs: use ->t_dfops for collapse/insert range operations
xfs: remove dfops param from internal bmap extent helpers
xfs: remove xfs_btree_cur bmbt dfops field
xfs: remove unused btree cursor bc_private.a.dfops field
xfs: use ->t_dfops for rmap extent swap operations
xfs: use ->t_dfops in cancel cow blocks operation
xfs: use ->t_dfops in reflink cow recover path
xfs: refactor dfops init to attach to transaction

 fs/xfs/libxfs/xfs_alloc.c          |   4 +-
 fs/xfs/libxfs/xfs_attr.c           | 116 ++++++++++---------
 fs/xfs/libxfs/xfs_attr_leaf.c      |  24 ++--
 fs/xfs/libxfs/xfs_attr_remote.c    |  22 ++--
 fs/xfs/libxfs/xfs_bmap.c           | 178 +++++++++++++----------------
 fs/xfs/libxfs/xfs_bmap.h           |  17 +--
 fs/xfs/libxfs/xfs_bmap_btree.c     |   9 +-
 fs/xfs/libxfs/xfs_btree.h          |   2 -
 fs/xfs/libxfs/xfs_da_btree.c       |  19 ++-
 fs/xfs/libxfs/xfs_da_btree.h       |   1 -
 fs/xfs/libxfs/xfs_defer.c          |  17 ++-
 fs/xfs/libxfs/xfs_defer.h          |   3 +-
 fs/xfs/libxfs/xfs_dir2.c           |  75 ++++++------
 fs/xfs/libxfs/xfs_dir2.h           |   9 +-
 fs/xfs/libxfs/xfs_ialloc.c         |   6 +-
 fs/xfs/libxfs/xfs_ialloc.h         |   1 -
 fs/xfs/libxfs/xfs_refcount.c       |  14 +--
 fs/xfs/libxfs/xfs_refcount_btree.c |   7 +-
 fs/xfs/libxfs/xfs_refcount_btree.h |   4 +-
 fs/xfs/scrub/common.c              |   2 +-
 fs/xfs/xfs_bmap_item.c             |   3 +
 fs/xfs/xfs_bmap_util.c             |  63 +++++-----
 fs/xfs/xfs_dquot.c                 |  33 +++---
 fs/xfs/xfs_filestream.c            |   3 +-
 fs/xfs/xfs_fsmap.c                 |   2 +-
 fs/xfs/xfs_inode.c                 |  87 +++++++-------
 fs/xfs/xfs_inode.h                 |   3 +-
 fs/xfs/xfs_iomap.c                 |  25 ++--
 fs/xfs/xfs_log_recover.c           |   2 +-
 fs/xfs/xfs_refcount_item.c         |   3 +
 fs/xfs/xfs_reflink.c               |  68 ++++++-----
 fs/xfs/xfs_rtalloc.c               |   8 +-
 fs/xfs/xfs_symlink.c               |  22 ++--
 fs/xfs/xfs_trans.c                 |   6 +-
 fs/xfs/xfs_trans.h                 |   2 +-
 35 files changed, 415 insertions(+), 445 deletions(-)
Signature · 1 line
2.17.1