All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 15/15] xfs: fold dfops into the transaction
Date: Mon, 30 Jul 2018 13:51:48 -0700	[thread overview]
Message-ID: <20180730205148.GP30972@magnolia> (raw)
In-Reply-To: <20180730164520.36882-16-bfoster@redhat.com>

On Mon, Jul 30, 2018 at 12:45:20PM -0400, Brian Foster wrote:
> struct xfs_defer_ops has now been reduced to a single list_head. The
> external dfops mechanism is unused and thus everywhere a (permanent)
> transaction is accessible the associated dfops structure is as well.
> 
> Remove the xfs_defer_ops structure and fold the list_head into the
> transaction. Also remove the last remnant of external dfops in
> xfs_trans_dup().
> 
> Signed-off-by: Brian Foster <bfoster@redhat.com>

Looks ok, I'll give it a spin to see how it does...
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

--D

> ---
>  fs/xfs/libxfs/xfs_bmap.c     |  1 -
>  fs/xfs/libxfs/xfs_btree.h    |  1 -
>  fs/xfs/libxfs/xfs_da_btree.h |  1 -
>  fs/xfs/libxfs/xfs_defer.c    | 65 +++++++++++-------------------------
>  fs/xfs/libxfs/xfs_defer.h    |  2 --
>  fs/xfs/libxfs/xfs_dir2.c     |  2 --
>  fs/xfs/libxfs/xfs_dir2.h     |  1 -
>  fs/xfs/xfs_inode.h           |  1 -
>  fs/xfs/xfs_reflink.c         |  5 ++-
>  fs/xfs/xfs_trace.h           | 33 +++++++++---------
>  fs/xfs/xfs_trans.c           | 11 +++---
>  fs/xfs/xfs_trans.h           |  8 ++---
>  12 files changed, 43 insertions(+), 88 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
> index f5f1fc47923e..0f9f522ab792 100644
> --- a/fs/xfs/libxfs/xfs_bmap.c
> +++ b/fs/xfs/libxfs/xfs_bmap.c
> @@ -4285,7 +4285,6 @@ xfs_bmapi_write(
>  	bma.ip = ip;
>  	bma.total = total;
>  	bma.datatype = 0;
> -	ASSERT(!tp || tp->t_dfops);
>  
>  	while (bno < end && n < *nmap) {
>  		bool			need_alloc = false, wasdelay = false;
> diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h
> index 503615f4d729..e3b3e9dce5da 100644
> --- a/fs/xfs/libxfs/xfs_btree.h
> +++ b/fs/xfs/libxfs/xfs_btree.h
> @@ -7,7 +7,6 @@
>  #define	__XFS_BTREE_H__
>  
>  struct xfs_buf;
> -struct xfs_defer_ops;
>  struct xfs_inode;
>  struct xfs_mount;
>  struct xfs_trans;
> diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h
> index 59e290ef334f..84dd865b6c3d 100644
> --- a/fs/xfs/libxfs/xfs_da_btree.h
> +++ b/fs/xfs/libxfs/xfs_da_btree.h
> @@ -7,7 +7,6 @@
>  #ifndef __XFS_DA_BTREE_H__
>  #define	__XFS_DA_BTREE_H__
>  
> -struct xfs_defer_ops;
>  struct xfs_inode;
>  struct xfs_trans;
>  struct zone;
> diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
> index 152190a69432..9ce9e1c75e23 100644
> --- a/fs/xfs/libxfs/xfs_defer.c
> +++ b/fs/xfs/libxfs/xfs_defer.c
> @@ -186,11 +186,10 @@ xfs_defer_intake_work(
>  	struct xfs_trans		*tp,
>  	struct list_head		*dop_pending)
>  {
> -	struct xfs_defer_ops		*dop = tp->t_dfops;
>  	struct list_head		*li;
>  	struct xfs_defer_pending	*dfp;
>  
> -	list_for_each_entry(dfp, &dop->dop_intake, dfp_list) {
> +	list_for_each_entry(dfp, &tp->t_dfops, dfp_list) {
>  		dfp->dfp_intent = dfp->dfp_type->create_intent(tp,
>  				dfp->dfp_count);
>  		trace_xfs_defer_intake_work(tp->t_mountp, dfp);
> @@ -200,7 +199,7 @@ xfs_defer_intake_work(
>  			dfp->dfp_type->log_item(tp, dfp->dfp_intent, li);
>  	}
>  
> -	list_splice_tail_init(&dop->dop_intake, dop_pending);
> +	list_splice_tail_init(&tp->t_dfops, dop_pending);
>  }
>  
>  /* Abort all the intents that were committed. */
> @@ -210,10 +209,9 @@ xfs_defer_trans_abort(
>  	struct list_head		*dop_pending,
>  	int				error)
>  {
> -	struct xfs_defer_ops		*dop = tp->t_dfops;
>  	struct xfs_defer_pending	*dfp;
>  
> -	trace_xfs_defer_trans_abort(tp->t_mountp, dop, _RET_IP_);
> +	trace_xfs_defer_trans_abort(tp->t_mountp, tp, _RET_IP_);
>  
>  	/* Abort intent items that don't have a done item. */
>  	if (dop_pending) {
> @@ -272,13 +270,12 @@ xfs_defer_trans_roll(
>  		}
>  	}
>  
> -	trace_xfs_defer_trans_roll((*tp)->t_mountp, (*tp)->t_dfops, _RET_IP_);
> +	trace_xfs_defer_trans_roll((*tp)->t_mountp, *tp, _RET_IP_);
>  
>  	/* Roll the transaction. */
>  	error = xfs_trans_roll(tp);
>  	if (error) {
> -		trace_xfs_defer_trans_roll_error((*tp)->t_mountp,
> -						 (*tp)->t_dfops, error);
> +		trace_xfs_defer_trans_roll_error((*tp)->t_mountp, *tp, error);
>  		xfs_defer_trans_abort(*tp,  dop_pending, error);
>  		return error;
>  	}
> @@ -303,7 +300,7 @@ xfs_defer_has_unfinished_work(
>  	struct list_head		*dop_pending)
>  {
>  	return !list_empty(dop_pending) ||
> -		!list_empty(&tp->t_dfops->dop_intake);
> +		!list_empty(&tp->t_dfops);
>  }
>  
>  /*
> @@ -313,7 +310,7 @@ static void
>  xfs_defer_reset(
>  	struct xfs_trans	*tp)
>  {
> -	ASSERT(list_empty(&tp->t_dfops->dop_intake));
> +	ASSERT(list_empty(&tp->t_dfops));
>  
>  	/*
>  	 * Low mode state transfers across transaction rolls to mirror dfops
> @@ -344,7 +341,7 @@ xfs_defer_finish_noroll(
>  
>  	ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES);
>  
> -	trace_xfs_defer_finish((*tp)->t_mountp, (*tp)->t_dfops, _RET_IP_);
> +	trace_xfs_defer_finish((*tp)->t_mountp, *tp, _RET_IP_);
>  
>  	/* Until we run out of pending work to finish... */
>  	while (xfs_defer_has_unfinished_work(*tp, &dop_pending)) {
> @@ -420,14 +417,13 @@ xfs_defer_finish_noroll(
>  
>  out:
>  	if (error) {
> -		trace_xfs_defer_finish_error((*tp)->t_mountp, (*tp)->t_dfops,
> -					     error);
> +		trace_xfs_defer_finish_error((*tp)->t_mountp, *tp, error);
>  		__xfs_defer_cancel(&dop_pending);
>  		xfs_defer_cancel(*tp);
>  		return error;
>  	}
>  
> -	trace_xfs_defer_finish_done((*tp)->t_mountp, (*tp)->t_dfops, _RET_IP_);
> +	trace_xfs_defer_finish_done((*tp)->t_mountp, *tp, _RET_IP_);
>  	return 0;
>  }
>  
> @@ -486,8 +482,8 @@ void
>  xfs_defer_cancel(
>  	struct xfs_trans	*tp)
>  {
> -	trace_xfs_defer_cancel(NULL, tp->t_dfops, _RET_IP_);
> -	__xfs_defer_cancel(&tp->t_dfops->dop_intake);
> +	trace_xfs_defer_cancel(NULL, tp, _RET_IP_);
> +	__xfs_defer_cancel(&tp->t_dfops);
>  }
>  
>  /* Add an item for later deferred processing. */
> @@ -497,7 +493,6 @@ xfs_defer_add(
>  	enum xfs_defer_ops_type		type,
>  	struct list_head		*li)
>  {
> -	struct xfs_defer_ops		*dop = tp->t_dfops;
>  	struct xfs_defer_pending	*dfp = NULL;
>  
>  	/*
> @@ -505,8 +500,8 @@ xfs_defer_add(
>  	 * If the last pending item has the same type, reuse it.  Else,
>  	 * create a new pending item at the end of the intake list.
>  	 */
> -	if (!list_empty(&dop->dop_intake)) {
> -		dfp = list_last_entry(&dop->dop_intake,
> +	if (!list_empty(&tp->t_dfops)) {
> +		dfp = list_last_entry(&tp->t_dfops,
>  				struct xfs_defer_pending, dfp_list);
>  		if (dfp->dfp_type->type != type ||
>  		    (dfp->dfp_type->max_items &&
> @@ -521,7 +516,7 @@ xfs_defer_add(
>  		dfp->dfp_done = NULL;
>  		dfp->dfp_count = 0;
>  		INIT_LIST_HEAD(&dfp->dfp_work);
> -		list_add_tail(&dfp->dfp_list, &dop->dop_intake);
> +		list_add_tail(&dfp->dfp_list, &tp->t_dfops);
>  	}
>  
>  	list_add_tail(li, &dfp->dfp_work);
> @@ -536,39 +531,17 @@ xfs_defer_init_op_type(
>  	defer_op_types[type->type] = type;
>  }
>  
> -/* Initialize a deferred operation. */
> -void
> -xfs_defer_init(
> -	struct xfs_trans		*tp,
> -	struct xfs_defer_ops		*dop)
> -{
> -	struct xfs_mount		*mp = NULL;
> -
> -	memset(dop, 0, sizeof(struct xfs_defer_ops));
> -	INIT_LIST_HEAD(&dop->dop_intake);
> -	if (tp) {
> -		ASSERT(tp->t_firstblock == NULLFSBLOCK);
> -		tp->t_dfops = dop;
> -		mp = tp->t_mountp;
> -	}
> -	trace_xfs_defer_init(mp, dop, _RET_IP_);
> -}
> -
>  /*
> - * Move state from one xfs_defer_ops to another and reset the source to initial
> - * state. This is primarily used to carry state forward across transaction rolls
> - * with internal dfops.
> + * Move deferred ops from one transaction to another and reset the source to
> + * initial state. This is primarily used to carry state forward across
> + * transaction rolls with pending dfops.
>   */
>  void
>  xfs_defer_move(
>  	struct xfs_trans	*dtp,
>  	struct xfs_trans	*stp)
>  {
> -	struct xfs_defer_ops	*dst = dtp->t_dfops;
> -	struct xfs_defer_ops	*src = stp->t_dfops;
> -	ASSERT(dst != src);
> -
> -	list_splice_init(&src->dop_intake, &dst->dop_intake);
> +	list_splice_init(&stp->t_dfops, &dtp->t_dfops);
>  
>  	/*
>  	 * Low free space mode was historically controlled by a dfops field.
> diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h
> index 295703737272..9ea37a8c464a 100644
> --- a/fs/xfs/libxfs/xfs_defer.h
> +++ b/fs/xfs/libxfs/xfs_defer.h
> @@ -7,7 +7,6 @@
>  #define	__XFS_DEFER_H__
>  
>  struct xfs_defer_op_type;
> -struct xfs_defer_ops;
>  
>  /*
>   * Save a log intent item and a list of extents, so that we can replay
> @@ -40,7 +39,6 @@ void xfs_defer_add(struct xfs_trans *tp, enum xfs_defer_ops_type type,
>  int xfs_defer_finish_noroll(struct xfs_trans **tp);
>  int xfs_defer_finish(struct xfs_trans **tp);
>  void xfs_defer_cancel(struct xfs_trans *);
> -void xfs_defer_init(struct xfs_trans *tp, struct xfs_defer_ops *dop);
>  bool xfs_defer_has_unfinished_work(struct xfs_trans *tp,
>  		struct list_head *dop_pending);
>  void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp);
> diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
> index 4ea1fddb126f..229152cd1a24 100644
> --- a/fs/xfs/libxfs/xfs_dir2.c
> +++ b/fs/xfs/libxfs/xfs_dir2.c
> @@ -424,7 +424,6 @@ xfs_dir_removename(
>  	int			v;		/* type-checking value */
>  
>  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
> -	ASSERT(tp->t_dfops);
>  	XFS_STATS_INC(dp->i_mount, xs_dir_remove);
>  
>  	args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
> @@ -483,7 +482,6 @@ xfs_dir_replace(
>  	int			v;		/* type-checking value */
>  
>  	ASSERT(S_ISDIR(VFS_I(dp)->i_mode));
> -	ASSERT(tp->t_dfops);
>  
>  	rval = xfs_dir_ino_validate(tp->t_mountp, inum);
>  	if (rval)
> diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h
> index ba5acd03de94..c3e3f6b813d8 100644
> --- a/fs/xfs/libxfs/xfs_dir2.h
> +++ b/fs/xfs/libxfs/xfs_dir2.h
> @@ -9,7 +9,6 @@
>  #include "xfs_da_format.h"
>  #include "xfs_da_btree.h"
>  
> -struct xfs_defer_ops;
>  struct xfs_da_args;
>  struct xfs_inode;
>  struct xfs_mount;
> diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
> index 79a3e61a6991..be2014520155 100644
> --- a/fs/xfs/xfs_inode.h
> +++ b/fs/xfs/xfs_inode.h
> @@ -15,7 +15,6 @@
>  struct xfs_dinode;
>  struct xfs_inode;
>  struct xfs_buf;
> -struct xfs_defer_ops;
>  struct xfs_bmbt_irec;
>  struct xfs_inode_log_item;
>  struct xfs_mount;
> diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
> index cbceb320a2e7..38f405415b88 100644
> --- a/fs/xfs/xfs_reflink.c
> +++ b/fs/xfs/xfs_reflink.c
> @@ -502,7 +502,6 @@ xfs_reflink_cancel_cow_blocks(
>  			if (error)
>  				break;
>  		} else if (del.br_state == XFS_EXT_UNWRITTEN || cancel_real) {
> -			ASSERT((*tpp)->t_dfops);
>  			ASSERT((*tpp)->t_firstblock == NULLFSBLOCK);
>  
>  			/* Free the CoW orphan record. */
> @@ -678,7 +677,7 @@ xfs_reflink_end_cow(
>  			goto prev_extent;
>  
>  		/* Unmap the old blocks in the data fork. */
> -		ASSERT(tp->t_dfops && tp->t_firstblock == NULLFSBLOCK);
> +		ASSERT(tp->t_firstblock == NULLFSBLOCK);
>  		rlen = del.br_blockcount;
>  		error = __xfs_bunmapi(tp, ip, del.br_startoff, &rlen, 0, 1);
>  		if (error)
> @@ -1021,7 +1020,7 @@ xfs_reflink_remap_extent(
>  	/* Unmap the old blocks in the data fork. */
>  	rlen = unmap_len;
>  	while (rlen) {
> -		ASSERT(tp->t_dfops && tp->t_firstblock == NULLFSBLOCK);
> +		ASSERT(tp->t_firstblock == NULLFSBLOCK);
>  		error = __xfs_bunmapi(tp, ip, destoff, &rlen, 0, 1);
>  		if (error)
>  			goto out_cancel;
> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
> index 6b55bbc09578..023c0445a231 100644
> --- a/fs/xfs/xfs_trace.h
> +++ b/fs/xfs/xfs_trace.h
> @@ -2213,57 +2213,56 @@ DEFINE_BTREE_CUR_EVENT(xfs_btree_overlapped_query_range);
>  
>  /* deferred ops */
>  struct xfs_defer_pending;
> -struct xfs_defer_ops;
>  
>  DECLARE_EVENT_CLASS(xfs_defer_class,
> -	TP_PROTO(struct xfs_mount *mp, struct xfs_defer_ops *dop,
> +	TP_PROTO(struct xfs_mount *mp, struct xfs_trans *tp,
>  		 unsigned long caller_ip),
> -	TP_ARGS(mp, dop, caller_ip),
> +	TP_ARGS(mp, tp, caller_ip),
>  	TP_STRUCT__entry(
>  		__field(dev_t, dev)
> -		__field(void *, dop)
> +		__field(void *, tp)
>  		__field(char, committed)
>  		__field(unsigned long, caller_ip)
>  	),
>  	TP_fast_assign(
>  		__entry->dev = mp ? mp->m_super->s_dev : 0;
> -		__entry->dop = dop;
> +		__entry->tp = tp;
>  		__entry->caller_ip = caller_ip;
>  	),
> -	TP_printk("dev %d:%d ops %p caller %pS",
> +	TP_printk("dev %d:%d tp %p caller %pS",
>  		  MAJOR(__entry->dev), MINOR(__entry->dev),
> -		  __entry->dop,
> +		  __entry->tp,
>  		  (char *)__entry->caller_ip)
>  )
>  #define DEFINE_DEFER_EVENT(name) \
>  DEFINE_EVENT(xfs_defer_class, name, \
> -	TP_PROTO(struct xfs_mount *mp, struct xfs_defer_ops *dop, \
> +	TP_PROTO(struct xfs_mount *mp, struct xfs_trans *tp, \
>  		 unsigned long caller_ip), \
> -	TP_ARGS(mp, dop, caller_ip))
> +	TP_ARGS(mp, tp, caller_ip))
>  
>  DECLARE_EVENT_CLASS(xfs_defer_error_class,
> -	TP_PROTO(struct xfs_mount *mp, struct xfs_defer_ops *dop, int error),
> -	TP_ARGS(mp, dop, error),
> +	TP_PROTO(struct xfs_mount *mp, struct xfs_trans *tp, int error),
> +	TP_ARGS(mp, tp, error),
>  	TP_STRUCT__entry(
>  		__field(dev_t, dev)
> -		__field(void *, dop)
> +		__field(void *, tp)
>  		__field(char, committed)
>  		__field(int, error)
>  	),
>  	TP_fast_assign(
>  		__entry->dev = mp ? mp->m_super->s_dev : 0;
> -		__entry->dop = dop;
> +		__entry->tp = tp;
>  		__entry->error = error;
>  	),
> -	TP_printk("dev %d:%d ops %p err %d",
> +	TP_printk("dev %d:%d tp %p err %d",
>  		  MAJOR(__entry->dev), MINOR(__entry->dev),
> -		  __entry->dop,
> +		  __entry->tp,
>  		  __entry->error)
>  )
>  #define DEFINE_DEFER_ERROR_EVENT(name) \
>  DEFINE_EVENT(xfs_defer_error_class, name, \
> -	TP_PROTO(struct xfs_mount *mp, struct xfs_defer_ops *dop, int error), \
> -	TP_ARGS(mp, dop, error))
> +	TP_PROTO(struct xfs_mount *mp, struct xfs_trans *tp, int error), \
> +	TP_ARGS(mp, tp, error))
>  
>  DECLARE_EVENT_CLASS(xfs_defer_pending_class,
>  	TP_PROTO(struct xfs_mount *mp, struct xfs_defer_pending *dfp),
> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
> index 20750cd9c9e7..d4faa0414927 100644
> --- a/fs/xfs/xfs_trans.c
> +++ b/fs/xfs/xfs_trans.c
> @@ -100,6 +100,7 @@ xfs_trans_dup(
>  	ntp->t_mountp = tp->t_mountp;
>  	INIT_LIST_HEAD(&ntp->t_items);
>  	INIT_LIST_HEAD(&ntp->t_busy);
> +	INIT_LIST_HEAD(&ntp->t_dfops);
>  	ntp->t_firstblock = NULLFSBLOCK;
>  
>  	ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
> @@ -120,12 +121,8 @@ xfs_trans_dup(
>  	tp->t_rtx_res = tp->t_rtx_res_used;
>  	ntp->t_pflags = tp->t_pflags;
>  
> -	/* copy the dfops pointer if it's external, otherwise move it */
> -	xfs_defer_init(ntp, &ntp->t_dfops_internal);
> -	if (tp->t_dfops != &tp->t_dfops_internal)
> -		ntp->t_dfops = tp->t_dfops;
> -	else
> -		xfs_defer_move(ntp, tp);
> +	/* move deferred ops over to the new tp */
> +	xfs_defer_move(ntp, tp);
>  
>  	xfs_trans_dup_dqinfo(tp, ntp);
>  
> @@ -280,8 +277,8 @@ xfs_trans_alloc(
>  	tp->t_mountp = mp;
>  	INIT_LIST_HEAD(&tp->t_items);
>  	INIT_LIST_HEAD(&tp->t_busy);
> +	INIT_LIST_HEAD(&tp->t_dfops);
>  	tp->t_firstblock = NULLFSBLOCK;
> -	xfs_defer_init(tp, &tp->t_dfops_internal);
>  
>  	error = xfs_trans_reserve(tp, resp, blocks, rtextents);
>  	if (error) {
> diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
> index 1cdc7c0ebeac..c3d278e96ad1 100644
> --- a/fs/xfs/xfs_trans.h
> +++ b/fs/xfs/xfs_trans.h
> @@ -90,13 +90,10 @@ void	xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item,
>  #define XFS_ITEM_FLUSHING	3
>  
>  /*
> - * Deferred operations tracking structure.
> + * Deferred operation item relogging limits.
>   */
>  #define XFS_DEFER_OPS_NR_INODES	2	/* join up to two inodes */
>  #define XFS_DEFER_OPS_NR_BUFS	2	/* join up to two buffers */
> -struct xfs_defer_ops {
> -	struct list_head	dop_intake;	/* unlogged pending work */
> -};
>  
>  /*
>   * This is the structure maintained for every active transaction.
> @@ -114,7 +111,6 @@ typedef struct xfs_trans {
>  	struct xlog_ticket	*t_ticket;	/* log mgr ticket */
>  	struct xfs_mount	*t_mountp;	/* ptr to fs mount struct */
>  	struct xfs_dquot_acct   *t_dqinfo;	/* acctg info for dquots */
> -	struct xfs_defer_ops	*t_dfops;	/* dfops reference */
>  	int64_t			t_icount_delta;	/* superblock icount change */
>  	int64_t			t_ifree_delta;	/* superblock ifree change */
>  	int64_t			t_fdblocks_delta; /* superblock fdblocks chg */
> @@ -136,8 +132,8 @@ typedef struct xfs_trans {
>  	int64_t			t_rextslog_delta;/* superblocks rextslog chg */
>  	struct list_head	t_items;	/* log item descriptors */
>  	struct list_head	t_busy;		/* list of busy extents */
> +	struct list_head	t_dfops;	/* deferred operations */
>  	unsigned long		t_pflags;	/* saved process flags state */
> -	struct xfs_defer_ops	t_dfops_internal;
>  } xfs_trans_t;
>  
>  /*
> -- 
> 2.17.1
> 
> --
> 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

  reply	other threads:[~2018-07-30 22:28 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-30 16:45 [PATCH 00/15] xfs: condense dfops and automatic relogging Brian Foster
2018-07-30 16:45 ` [PATCH 01/15] xfs: refactor internal dfops initialization Brian Foster
2018-07-30 19:30   ` Darrick J. Wong
2018-07-31  8:10     ` Christoph Hellwig
2018-07-31 11:47     ` Brian Foster
2018-07-31 14:08       ` Darrick J. Wong
2018-07-30 16:45 ` [PATCH 02/15] xfs: use transaction for intent recovery instead of raw dfops Brian Foster
2018-07-30 20:09   ` Darrick J. Wong
2018-07-31  8:12     ` Christoph Hellwig
2018-07-31 11:47     ` Brian Foster
2018-07-31 14:18       ` Darrick J. Wong
2018-07-31  8:13   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 03/15] xfs: remove unused __xfs_defer_cancel() internal helper Brian Foster
2018-07-30 20:09   ` Darrick J. Wong
2018-07-31  8:13   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 04/15] xfs: pass transaction to dfops reset/move helpers Brian Foster
2018-07-30 20:10   ` Darrick J. Wong
2018-07-31  8:14   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 05/15] xfs: replace dop_low with transaction flag Brian Foster
2018-07-30 20:11   ` Darrick J. Wong
2018-07-31  8:16   ` Christoph Hellwig
2018-07-31 11:47     ` Brian Foster
2018-07-30 16:45 ` [PATCH 06/15] xfs: add missing defer ijoins for held inodes Brian Foster
2018-07-30 20:15   ` Darrick J. Wong
2018-07-31  8:17   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 07/15] xfs: automatic dfops buffer relogging Brian Foster
2018-07-30 20:20   ` Darrick J. Wong
2018-07-31 11:48     ` Brian Foster
2018-07-31  8:19   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 08/15] xfs: automatic dfops inode relogging Brian Foster
2018-07-30 20:22   ` Darrick J. Wong
2018-07-31  8:19   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 09/15] xfs: drop dop param from xfs_defer_op_type ->finish_item() callback Brian Foster
2018-07-30 20:23   ` Darrick J. Wong
2018-07-31  8:20   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 10/15] xfs: clean out superfluous dfops dop params/vars Brian Foster
2018-07-30 20:24   ` Darrick J. Wong
2018-07-31  8:20   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 11/15] xfs: cancel dfops on xfs_defer_finish() error Brian Foster
2018-07-30 20:27   ` Darrick J. Wong
2018-07-31  8:21   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 12/15] xfs: replace xfs_defer_ops ->dop_pending with on-stack list Brian Foster
2018-07-30 20:47   ` Darrick J. Wong
2018-07-31 11:50     ` Brian Foster
2018-07-31  8:30   ` Christoph Hellwig
2018-07-31 11:50     ` Brian Foster
2018-07-30 16:45 ` [PATCH 13/15] xfs: pass transaction to xfs_defer_add() Brian Foster
2018-07-30 20:49   ` Darrick J. Wong
2018-07-31  8:31   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 14/15] xfs: always defer agfl block frees Brian Foster
2018-07-30 20:49   ` Darrick J. Wong
2018-07-31  8:32   ` Christoph Hellwig
2018-07-30 16:45 ` [PATCH 15/15] xfs: fold dfops into the transaction Brian Foster
2018-07-30 20:51   ` Darrick J. Wong [this message]
2018-07-31  8:36   ` Christoph Hellwig
2018-07-31 11:49     ` Brian Foster

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=20180730205148.GP30972@magnolia \
    --to=darrick.wong@oracle.com \
    --cc=bfoster@redhat.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.