From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/3] xfs: refactor xfs_trans_roll
Date: Mon, 28 Aug 2017 10:33:09 -0700 [thread overview]
Message-ID: <20170828173309.GD4757@magnolia> (raw)
In-Reply-To: <20170828074458.23786-2-hch@lst.de>
On Mon, Aug 28, 2017 at 09:44:56AM +0200, Christoph Hellwig wrote:
> Split xfs_trans_roll into a low-level helper that just rolls the
> actual transaction and a new higher level xfs_trans_roll_inode
> that takes care of logging and rejoining the inode. This gets
> rid of the NULL inode case, and allows to simplify the special
> cases in the deferred operation code.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok, will test...
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> fs/xfs/libxfs/xfs_attr.c | 16 ++++++++--------
> fs/xfs/libxfs/xfs_attr_leaf.c | 6 +++---
> fs/xfs/libxfs/xfs_attr_remote.c | 4 ++--
> fs/xfs/libxfs/xfs_defer.c | 23 +++++++++--------------
> fs/xfs/xfs_attr_inactive.c | 6 +++---
> fs/xfs/xfs_inode.c | 4 ++--
> fs/xfs/xfs_trans.c | 28 +++++-----------------------
> fs/xfs/xfs_trans.h | 3 ++-
> fs/xfs/xfs_trans_inode.c | 14 ++++++++++++++
> 9 files changed, 48 insertions(+), 56 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
> index de7b9bd30bec..bafa0f6bfafa 100644
> --- a/fs/xfs/libxfs/xfs_attr.c
> +++ b/fs/xfs/libxfs/xfs_attr.c
> @@ -341,7 +341,7 @@ xfs_attr_set(
> * transaction to add the new attribute to the leaf.
> */
>
> - error = xfs_trans_roll(&args.trans, dp);
> + error = xfs_trans_roll_inode(&args.trans, dp);
> if (error)
> goto out;
>
> @@ -605,7 +605,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
> * Commit the current trans (including the inode) and start
> * a new one.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> return error;
>
> @@ -620,7 +620,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
> * Commit the transaction that added the attr name so that
> * later routines can manage their own transactions.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> return error;
>
> @@ -697,7 +697,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
> /*
> * Commit the remove and start the next trans in series.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
>
> } else if (args->rmtblkno > 0) {
> /*
> @@ -885,7 +885,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
> * Commit the node conversion and start the next
> * trans in the chain.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> goto out;
>
> @@ -925,7 +925,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
> * Commit the leaf addition or btree split and start the next
> * trans in the chain.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> goto out;
>
> @@ -1012,7 +1012,7 @@ xfs_attr_node_addname(xfs_da_args_t *args)
> /*
> * Commit and start the next trans in the chain.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> goto out;
>
> @@ -1132,7 +1132,7 @@ xfs_attr_node_removename(xfs_da_args_t *args)
> /*
> * Commit the Btree join operation and start a new trans.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> goto out;
> }
> diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
> index c6c15e5717e4..5c16db86b38f 100644
> --- a/fs/xfs/libxfs/xfs_attr_leaf.c
> +++ b/fs/xfs/libxfs/xfs_attr_leaf.c
> @@ -2608,7 +2608,7 @@ xfs_attr3_leaf_clearflag(
> /*
> * Commit the flag value change and start the next trans in series.
> */
> - return xfs_trans_roll(&args->trans, args->dp);
> + return xfs_trans_roll_inode(&args->trans, args->dp);
> }
>
> /*
> @@ -2659,7 +2659,7 @@ xfs_attr3_leaf_setflag(
> /*
> * Commit the flag value change and start the next trans in series.
> */
> - return xfs_trans_roll(&args->trans, args->dp);
> + return xfs_trans_roll_inode(&args->trans, args->dp);
> }
>
> /*
> @@ -2777,7 +2777,7 @@ xfs_attr3_leaf_flipflags(
> /*
> * Commit the flag value change and start the next trans in series.
> */
> - error = xfs_trans_roll(&args->trans, args->dp);
> + error = xfs_trans_roll_inode(&args->trans, args->dp);
>
> return error;
> }
> diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c
> index 5236d8e45146..433c36714e40 100644
> --- a/fs/xfs/libxfs/xfs_attr_remote.c
> +++ b/fs/xfs/libxfs/xfs_attr_remote.c
> @@ -484,7 +484,7 @@ xfs_attr_rmtval_set(
> /*
> * Start the next trans in the chain.
> */
> - error = xfs_trans_roll(&args->trans, dp);
> + error = xfs_trans_roll_inode(&args->trans, dp);
> if (error)
> return error;
> }
> @@ -621,7 +621,7 @@ xfs_attr_rmtval_remove(
> /*
> * Close out trans and start the next one in the chain.
> */
> - error = xfs_trans_roll(&args->trans, args->dp);
> + error = xfs_trans_roll_inode(&args->trans, args->dp);
> if (error)
> return error;
> }
> diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
> index 5c2929f94bd3..4ea2f068d95c 100644
> --- a/fs/xfs/libxfs/xfs_defer.c
> +++ b/fs/xfs/libxfs/xfs_defer.c
> @@ -240,23 +240,19 @@ xfs_defer_trans_abort(
> STATIC int
> xfs_defer_trans_roll(
> struct xfs_trans **tp,
> - struct xfs_defer_ops *dop,
> - struct xfs_inode *ip)
> + struct xfs_defer_ops *dop)
> {
> int i;
> int error;
>
> - /* Log all the joined inodes except the one we passed in. */
> - for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++) {
> - if (dop->dop_inodes[i] == ip)
> - continue;
> + /* Log all the joined inodes. */
> + for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++)
> xfs_trans_log_inode(*tp, dop->dop_inodes[i], XFS_ILOG_CORE);
> - }
>
> trace_xfs_defer_trans_roll((*tp)->t_mountp, dop);
>
> /* Roll the transaction. */
> - error = xfs_trans_roll(tp, ip);
> + error = xfs_trans_roll(tp);
> if (error) {
> trace_xfs_defer_trans_roll_error((*tp)->t_mountp, dop, error);
> xfs_defer_trans_abort(*tp, dop, error);
> @@ -264,12 +260,9 @@ xfs_defer_trans_roll(
> }
> dop->dop_committed = true;
>
> - /* Rejoin the joined inodes except the one we passed in. */
> - for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++) {
> - if (dop->dop_inodes[i] == ip)
> - continue;
> + /* Rejoin the joined inodes. */
> + for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++)
> xfs_trans_ijoin(*tp, dop->dop_inodes[i], 0);
> - }
>
> return error;
> }
> @@ -331,13 +324,15 @@ xfs_defer_finish(
>
> trace_xfs_defer_finish((*tp)->t_mountp, dop);
>
> + xfs_defer_join(dop, ip);
> +
> /* 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. */
> xfs_defer_intake_work(*tp, dop);
>
> /* Roll the transaction. */
> - error = xfs_defer_trans_roll(tp, dop, ip);
> + error = xfs_defer_trans_roll(tp, dop);
> if (error)
> goto out;
>
> diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c
> index be0b79d8900f..ebd66b19fbfc 100644
> --- a/fs/xfs/xfs_attr_inactive.c
> +++ b/fs/xfs/xfs_attr_inactive.c
> @@ -97,7 +97,7 @@ xfs_attr3_leaf_freextent(
> /*
> * Roll to next transaction.
> */
> - error = xfs_trans_roll(trans, dp);
> + error = xfs_trans_roll_inode(trans, dp);
> if (error)
> return error;
> }
> @@ -308,7 +308,7 @@ xfs_attr3_node_inactive(
> /*
> * Atomically commit the whole invalidate stuff.
> */
> - error = xfs_trans_roll(trans, dp);
> + error = xfs_trans_roll_inode(trans, dp);
> if (error)
> return error;
> }
> @@ -375,7 +375,7 @@ xfs_attr3_root_inactive(
> /*
> * Commit the invalidate and start the next transaction.
> */
> - error = xfs_trans_roll(trans, dp);
> + error = xfs_trans_roll_inode(trans, dp);
>
> return error;
> }
> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> index ff48f0096810..5b4eda44f39f 100644
> --- a/fs/xfs/xfs_inode.c
> +++ b/fs/xfs/xfs_inode.c
> @@ -1055,7 +1055,7 @@ xfs_dir_ialloc(
> tp->t_flags &= ~(XFS_TRANS_DQ_DIRTY);
> }
>
> - code = xfs_trans_roll(&tp, NULL);
> + code = xfs_trans_roll(&tp);
> if (committed != NULL)
> *committed = 1;
>
> @@ -1611,7 +1611,7 @@ xfs_itruncate_extents(
> if (error)
> goto out_bmap_cancel;
>
> - error = xfs_trans_roll(&tp, ip);
> + error = xfs_trans_roll_inode(&tp, ip);
> if (error)
> goto out;
> }
> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
> index 2011620008de..a87f657f59c9 100644
> --- a/fs/xfs/xfs_trans.c
> +++ b/fs/xfs/xfs_trans.c
> @@ -1035,25 +1035,18 @@ xfs_trans_cancel(
> */
> int
> xfs_trans_roll(
> - struct xfs_trans **tpp,
> - struct xfs_inode *dp)
> + struct xfs_trans **tpp)
> {
> - struct xfs_trans *trans;
> + struct xfs_trans *trans = *tpp;
> struct xfs_trans_res tres;
> int error;
>
> /*
> - * Ensure that the inode is always logged.
> - */
> - trans = *tpp;
> - if (dp)
> - xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE);
> -
> - /*
> * Copy the critical parameters from one trans to the next.
> */
> tres.tr_logres = trans->t_log_res;
> tres.tr_logcount = trans->t_log_count;
> +
> *tpp = xfs_trans_dup(trans);
>
> /*
> @@ -1067,10 +1060,8 @@ xfs_trans_roll(
> if (error)
> return error;
>
> - trans = *tpp;
> -
> /*
> - * Reserve space in the log for th next transaction.
> + * Reserve space in the log for the next transaction.
> * This also pushes items in the "AIL", the list of logged items,
> * out to disk if they are taking up space at the tail of the log
> * that we want to use. This requires that either nothing be locked
> @@ -1078,14 +1069,5 @@ xfs_trans_roll(
> * the prior and the next transactions.
> */
> tres.tr_logflags = XFS_TRANS_PERM_LOG_RES;
> - error = xfs_trans_reserve(trans, &tres, 0, 0);
> - /*
> - * Ensure that the inode is in the new transaction and locked.
> - */
> - if (error)
> - return error;
> -
> - if (dp)
> - xfs_trans_ijoin(trans, dp, 0);
> - return 0;
> + return xfs_trans_reserve(*tpp, &tres, 0, 0);
> }
> diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
> index 7d627721e4b3..b25d3d22e289 100644
> --- a/fs/xfs/xfs_trans.h
> +++ b/fs/xfs/xfs_trans.h
> @@ -228,7 +228,8 @@ int xfs_trans_free_extent(struct xfs_trans *,
> struct xfs_efd_log_item *, xfs_fsblock_t,
> xfs_extlen_t, struct xfs_owner_info *);
> int xfs_trans_commit(struct xfs_trans *);
> -int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *);
> +int xfs_trans_roll(struct xfs_trans **);
> +int xfs_trans_roll_inode(struct xfs_trans **, struct xfs_inode *);
> void xfs_trans_cancel(xfs_trans_t *);
> int xfs_trans_ail_init(struct xfs_mount *);
> void xfs_trans_ail_destroy(struct xfs_mount *);
> diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c
> index dab8daa676f9..daa7615497f9 100644
> --- a/fs/xfs/xfs_trans_inode.c
> +++ b/fs/xfs/xfs_trans_inode.c
> @@ -134,3 +134,17 @@ xfs_trans_log_inode(
> flags |= ip->i_itemp->ili_last_fields;
> ip->i_itemp->ili_fields |= flags;
> }
> +
> +int
> +xfs_trans_roll_inode(
> + struct xfs_trans **tpp,
> + struct xfs_inode *ip)
> +{
> + int error;
> +
> + xfs_trans_log_inode(*tpp, ip, XFS_ILOG_CORE);
> + error = xfs_trans_roll(tpp);
> + if (!error)
> + xfs_trans_ijoin(*tpp, ip, 0);
> + return error;
> +}
> --
> 2.11.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-08-28 17:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-28 7:44 explicitly join inodes to deferred operations V2 (this time for real) Christoph Hellwig
2017-08-28 7:44 ` [PATCH 1/3] xfs: refactor xfs_trans_roll Christoph Hellwig
2017-08-28 17:33 ` Darrick J. Wong [this message]
2017-08-28 7:44 ` [PATCH 2/3] xfs: rename xfs_defer_join to xfs_defer_ijoin Christoph Hellwig
2017-08-28 7:44 ` [PATCH 3/3] xfs: remove the ip argument to xfs_defer_finish Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2017-08-13 14:42 explicitly join inodes to deferred operations Christoph Hellwig
2017-08-13 14:42 ` [PATCH 1/3] xfs: refactor xfs_trans_roll Christoph Hellwig
2017-08-15 1:36 ` Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170828173309.GD4757@magnolia \
--to=darrick.wong@oracle.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).