Re: [PATCH 1/3] xfs: refactor xfs_trans_roll

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxx>

Looks ok, will test...
Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>

> ---
>  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@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



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux