linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Allison Henderson <allison.henderson@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH v15 11/22] xfs: Add delay ready attr remove routines
Date: Tue, 2 Mar 2021 01:26:04 -0700	[thread overview]
Message-ID: <3f82db7d-b8b3-c490-da9a-7100c47eca47@oracle.com> (raw)
In-Reply-To: <YDu5K+M43oyM4LIG@bfoster>



On 2/28/21 8:39 AM, Brian Foster wrote:
> On Thu, Feb 25, 2021 at 03:28:00PM -0700, Allison Henderson wrote:
>>
>>
>> On 2/25/21 7:22 AM, Brian Foster wrote:
>>> On Thu, Feb 25, 2021 at 12:01:10AM -0700, Allison Henderson wrote:
>>>>
>>>>
>>>> On 2/24/21 11:45 AM, Brian Foster wrote:
>>>>> On Thu, Feb 18, 2021 at 09:53:37AM -0700, Allison Henderson wrote:
>>>>>> This patch modifies the attr remove routines to be delay ready. This
>>>>>> means they no longer roll or commit transactions, but instead return
>>>>>> -EAGAIN to have the calling routine roll and refresh the transaction. In
>>>>>> this series, xfs_attr_remove_args has become xfs_attr_remove_iter, which
>>>>>> uses a sort of state machine like switch to keep track of where it was
>>>>>> when EAGAIN was returned. xfs_attr_node_removename has also been
>>>>>> modified to use the switch, and a new version of xfs_attr_remove_args
>>>>>> consists of a simple loop to refresh the transaction until the operation
>>>>>> is completed. A new XFS_DAC_DEFER_FINISH flag is used to finish the
>>>>>> transaction where ever the existing code used to.
>>>>>>
>>>>>> Calls to xfs_attr_rmtval_remove are replaced with the delay ready
>>>>>> version __xfs_attr_rmtval_remove. We will rename
>>>>>> __xfs_attr_rmtval_remove back to xfs_attr_rmtval_remove when we are
>>>>>> done.
>>>>>>
>>>>>> xfs_attr_rmtval_remove itself is still in use by the set routines (used
>>>>>> during a rename).  For reasons of preserving existing function, we
>>>>>> modify xfs_attr_rmtval_remove to call xfs_defer_finish when the flag is
>>>>>> set.  Similar to how xfs_attr_remove_args does here.  Once we transition
>>>>>> the set routines to be delay ready, xfs_attr_rmtval_remove is no longer
>>>>>> used and will be removed.
>>>>>>
>>>>>> This patch also adds a new struct xfs_delattr_context, which we will use
>>>>>> to keep track of the current state of an attribute operation. The new
>>>>>> xfs_delattr_state enum is used to track various operations that are in
>>>>>> progress so that we know not to repeat them, and resume where we left
>>>>>> off before EAGAIN was returned to cycle out the transaction. Other
>>>>>> members take the place of local variables that need to retain their
>>>>>> values across multiple function recalls.  See xfs_attr.h for a more
>>>>>> detailed diagram of the states.
>>>>>>
>>>>>> Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
>>>>>> ---
>>>>>>     fs/xfs/libxfs/xfs_attr.c        | 223 +++++++++++++++++++++++++++++-----------
>>>>>>     fs/xfs/libxfs/xfs_attr.h        | 100 ++++++++++++++++++
>>>>>>     fs/xfs/libxfs/xfs_attr_leaf.c   |   2 +-
>>>>>>     fs/xfs/libxfs/xfs_attr_remote.c |  48 +++++----
>>>>>>     fs/xfs/libxfs/xfs_attr_remote.h |   2 +-
>>>>>>     fs/xfs/xfs_attr_inactive.c      |   2 +-
>>>>>>     6 files changed, 294 insertions(+), 83 deletions(-)
>>>>>>
>>>>>> diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
>>>>>> index 56d4b56..d46b92a 100644
>>>>>> --- a/fs/xfs/libxfs/xfs_attr.c
>>>>>> +++ b/fs/xfs/libxfs/xfs_attr.c
>>> ...
>>>>>> @@ -1285,51 +1365,74 @@ xfs_attr_node_remove_step(
>>>>>>      *
>>>>>>      * This routine will find the blocks of the name to remove, remove them and
>>>>>>      * shrink the tree if needed.
>>>>>> + *
>>>>>> + * This routine is meant to function as either an inline or delayed operation,
>>>>>> + * and may return -EAGAIN when the transaction needs to be rolled.  Calling
>>>>>> + * functions will need to handle this, and recall the function until a
>>>>>> + * successful error code is returned.
>>>>>>      */
>>>>>>     STATIC int
>>>>>> -xfs_attr_node_removename(
>>>>>> -	struct xfs_da_args	*args)
>>>>>> +xfs_attr_node_removename_iter(
>>>>>> +	struct xfs_delattr_context	*dac)
>>>>>>     {
>>>>>> -	struct xfs_da_state	*state = NULL;
>>>>>> -	int			retval, error;
>>>>>> -	struct xfs_inode	*dp = args->dp;
>>>>>> +	struct xfs_da_args		*args = dac->da_args;
>>>>>> +	struct xfs_da_state		*state = NULL;
>>>>>> +	int				retval, error;
>>>>>> +	struct xfs_inode		*dp = args->dp;
>>>>>>     	trace_xfs_attr_node_removename(args);
>>>>>> -	error = xfs_attr_node_removename_setup(args, &state);
>>>>>> -	if (error)
>>>>>> -		goto out;
>>>>>> -
>>>>>> -	error = xfs_attr_node_remove_step(args, state);
>>>>>> -	if (error)
>>>>>> -		goto out;
>>>>>> -
>>>>>> -	retval = xfs_attr_node_remove_cleanup(args, state);
>>>>>> -
>>>>>> -	/*
>>>>>> -	 * Check to see if the tree needs to be collapsed.
>>>>>> -	 */
>>>>>> -	if (retval && (state->path.active > 1)) {
>>>>>> -		error = xfs_da3_join(state);
>>>>>> -		if (error)
>>>>>> -			goto out;
>>>>>> -		error = xfs_defer_finish(&args->trans);
>>>>>> +	if (!dac->da_state) {
>>>>>> +		error = xfs_attr_node_removename_setup(dac);
>>>>>>     		if (error)
>>>>>>     			goto out;
>>>>>> +	}
>>>>>> +	state = dac->da_state;
>>>>>> +
>>>>>> +	switch (dac->dela_state) {
>>>>>> +	case XFS_DAS_UNINIT:
>>>>>>     		/*
>>>>>> -		 * Commit the Btree join operation and start a new trans.
>>>>>> +		 * repeatedly remove remote blocks, remove the entry and join.
>>>>>> +		 * returns -EAGAIN or 0 for completion of the step.
>>>>>>     		 */
>>>>>> -		error = xfs_trans_roll_inode(&args->trans, dp);
>>>>>> +		error = xfs_attr_node_remove_step(dac);
>>>>>>     		if (error)
>>>>>> -			goto out;
>>>>>> -	}
>>>>>> +			break;
>>>>>
>>>>> Hmm.. so re: my comment further down on xfs_attr_rmtval_remove(),
>>>>> wouldn't that change semantics here? I.e., once remote blocks are
>>>>> removed this would previously carry on with a clean transaction. Now it
>>>>> looks like we'd carry on with the dirty transaction that removed the
>>>>> last remote extent. This suggests that perhaps we should return once
>>>>> more and fall into a new state to remove the name..?
>>>> I suspect the diff might be making this a bit difficult to see.  The roll
>>>> that you see being removed here belongs to the transaction we hoisted up  in
>>>> patch 3 which happens after the clean up below, and we have the
>>>> corresponding EAGAIN fot that one.  I think the diff gets things a little
>>>> interlaced here because the switch adds another level of indentation.
>>>>
>>>
>>> Hmm.. the roll in patch 3 appears to be related to the _cleanup()
>>> helper. What I'm referring to here is the state of the transaction after
>>> the final remote block is removed from the attr. I'm not sure we're
>>> talking about the same thing here..
>>>
>>>> some times i do like to I use a graphical diffviewer like diffuse when
>>>> patches get weird like this.  Something like this:
>>>>
>>>> git config --global diff.tool  diffuse
>>>> git difftool 3c53e49 e201c09
>>>>
>>>> You'd need to download the branch and also the diffuse tool, but sometimes i
>>>> think it makes some of these diffs a bit easier to see
>>>>
>>>
>>> I think it's easier just to refer to the code directly. The current
>>> upstream code flows down into:
>>>
>>> ...
>>> xfs_attr_node_removename()
>>>    xfs_attr_node_remove_rmt()
>>>     xfs_attr_rmtval_remove()
>>>
>>> ... which then implements the following loop:
>>>
>>>           do {
>>>                   retval = __xfs_attr_rmtval_remove(args);
>>>                   if (retval && retval != -EAGAIN)
>>>                           return retval;
>>>
>>>                   /*
>>>                    * Close out trans and start the next one in the chain.
>>>                    */
>>>                   error = xfs_trans_roll_inode(&args->trans, args->dp);
>>>                   if (error)
>>>                           return error;
>>>           } while (retval == -EAGAIN);
>>>
>>> This rolls the transaction when retval == -EAGAIN or retval == 0, thus
>>> always returns with a clean transaction after the remote block removal
>>> completes.
>>>
>>> The code as of this patch does:
>>>
>>> ...
>>> xfs_attr_node_removename_iter()
>>>    xfs_attr_node_remove_step()
>>>     xfs_attr_node_remove_rmt()
>>>      __xfs_attr_rmtval_remove()
>>>
>>> ... which either returns -EAGAIN (since the roll is now implemented at
>>> the very top) or 0 when done == true. The transaction might be dirty in
>>> the latter case, but xfs_attr_node_removename_iter() moves right on to
>>> xfs_attr_node_remove_cleanup() which can now do more work in that same
>>> transaction. Am I following that correctly?
>>>
>>>> Also, it would be
>>>>> nice to remove the several seemingly unnecessary layers of indirection
>>>>> here. For example, something like the following (also considering my
>>>>> comment above wrt to xfs_attr_remove_iter() and UNINIT):
>>>>>
>>>>> 	case UNINIT:
>>>>> 		...
>>>>> 		/* fallthrough */
>>>>> 	case RMTBLK:
>>>>> 		if (args->rmtblkno > 0) {
>>>>> 			dac->dela_state = RMTBLK;
>>>>> 			error = __xfs_attr_rmtval_remove(dac);
>>>>> 			if (error)
>>>>> 				break;
>>>>>
>>>>> 			ASSERT(args->rmtblkno == 0);
>>>>> 			xfs_attr_refillstate(state);
>>>>> 			dac->flags |= XFS_DAC_DEFER_FINISH;
>>>>> 			dac->dela_state = RMNAME;
>>>>> 			return -EAGAIN;
>>>>> 		}
>>>> Ok, this looks to me like we've hoisted both xfs_attr_node_remove_rmt and
>>>> xfs_attr_node_remove_step into this scope, but I still think this adds an
>>>> extra roll where non previously was.  With out that extra EAGAIN, I think we
>>>> are fine to have all that just under the UNINIT case.  I also think it's
>>>> also worth noteing here that this is kind of a reverse of patch 1, which I
>>>> think we put in for reasons of trying to modularize the higher level
>>>> functions as much as possible.
>>>>
>>>> I suspect some of where you were going with this may have been influenced by
>>>> the earlier diff confusion too.  Maybe take a second look there before we go
>>>> too much down this change....
>>>>
>>>
>>> I can certainly be getting lost somewhere in all the refactoring. If so,
>>> can you point out where in the flow described above?
>> Ok, I think see it.  So basically I think this means we cant have the
>> helpers because it's ambiguos as to if the transaction is dirty or not.  I
>> dont see that there's anything in the review history where we rationalized
>> that away, so I think we just overlooked it.  So I think what this means is
>> that we need to reverse apply commit 72b97ea40d (which is where we added
>> xfs_attr_node_remove_rmt), then drop patch 1 which leaves no need for patch
>> 3, since the transaction will have not moved.  Then add state RMTBLK?  I
>> think that arrives at what you have here.
>>
> 
> It's not clear to me if anything needs to change before this patch or
> the changes can just fold into this patch itself. You probably have a
> better sense of that than I do atm. 
I can unfold it here in this patch too if people prefer. I'm getting the 
impression that others are having a hard time keeping up with the 
refactoring, so maybe that might be better.


 From my perspective, I think we want
> that transaction to roll after the final remote extent removal unless we
> had some reason to explicitly change existing behavior. This used to be
> handled by the old loop that rolled the transaction down in the remote
> block removal code. ISTM that the proper way to maintain the same
> behavior in the new state machine code is to unconditionally fall out of
> a RMTBLKREMOVE state with an -EAGAIN from _iter().
Sure, I think that describes what you have up there

> 
> IOW, __xfs_attr_rmtval_remove() returns -EAGAIN when it has more work to
> do. _iter() returns -EAGAIN when __xfs_attr_rmtval_remove() was called,
> finished its work, but we need to roll the transaction before the next
> step of the operation..
Right, ok, will make those modifcations here then.  Thanks for the 
reviews!  I know it's a lot.

Allison

> 
> Brian
> 
>> Allison
>>
>>>
>>> Brian
>>>
>>>>
>>>>> 		/* fallthrough */
>>>>> 	case RMNAME:
>>>>> 		...
>>>>> 	...
>>>>>
>>>>>> -	/*
>>>>>> -	 * If the result is small enough, push it all into the inode.
>>>>>> -	 */
>>>>>> -	if (xfs_bmap_one_block(dp, XFS_ATTR_FORK))
>>>>>> -		error = xfs_attr_node_shrink(args, state);
>>>>>> +		retval = xfs_attr_node_remove_cleanup(args, state);
>>>>> ...
>>>> I think the overlooked EAGAIN was in this area that got clipped out.....
>>>>
>>>>>> diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c
>>>>>> index 48d8e9c..f09820c 100644
>>>>>> --- a/fs/xfs/libxfs/xfs_attr_remote.c
>>>>>> +++ b/fs/xfs/libxfs/xfs_attr_remote.c
>>>>> ...
>>>>>> @@ -685,31 +687,29 @@ c(
>>>>>>     	 * Keep de-allocating extents until the remote-value region is gone.
>>>>>>     	 */
>>>>>>     	do {
>>>>>> -		retval = __xfs_attr_rmtval_remove(args);
>>>>>> -		if (retval && retval != -EAGAIN)
>>>>>> -			return retval;
>>>>>> +		error = __xfs_attr_rmtval_remove(&dac);
>>>>>> +		if (error != -EAGAIN)
>>>>>> +			break;
>>>>>
>>>>> Previously this would roll once and exit the loop on retval == 0. Now it
>>>>> looks like we break out of the loop immediately. Why the change?
>>>>
>>>> Gosh, I think sometime in reviewing v9, we had come up with a
>>>> "xfs_attr_roll_again" helper that took the error code as a paramater and
>>>> decided whether or not to roll.  And then in v10 i think people thought that
>>>> was weird and we turned it into xfs_attr_trans_roll.  I think I likley
>>>> forgot to restore the orginal retval handling here.  This whole function
>>>> disappears in the next patch, but the original error handling should be
>>>> restored to keep things consistent. Thx for the catch!
>>>>
>>>>
>>>> Thx for the reviews!!  I know it's complicated!  I've chased my tail many
>>>> times with it myself :-)
>>>>
>>>> Allison
>>>>
>>>>
>>>>
>>>>
>>>>>
>>>>> Brian
>>>>>
>>>>>> -		/*
>>>>>> -		 * Close out trans and start the next one in the chain.
>>>>>> -		 */
>>>>>> -		error = xfs_trans_roll_inode(&args->trans, args->dp);
>>>>>> +		error = xfs_attr_trans_roll(&dac);
>>>>>>     		if (error)
>>>>>>     			return error;
>>>>>> -	} while (retval == -EAGAIN);
>>>>>> +	} while (true);
>>>>>> -	return 0;
>>>>>> +	return error;
>>>>>>     }
>>>>>>     /*
>>>>>>      * Remove the value associated with an attribute by deleting the out-of-line
>>>>>> - * buffer that it is stored on. Returns EAGAIN for the caller to refresh the
>>>>>> + * buffer that it is stored on. Returns -EAGAIN for the caller to refresh the
>>>>>>      * transaction and re-call the function
>>>>>>      */
>>>>>>     int
>>>>>>     __xfs_attr_rmtval_remove(
>>>>>> -	struct xfs_da_args	*args)
>>>>>> +	struct xfs_delattr_context	*dac)
>>>>>>     {
>>>>>> -	int			error, done;
>>>>>> +	struct xfs_da_args		*args = dac->da_args;
>>>>>> +	int				error, done;
>>>>>>     	/*
>>>>>>     	 * Unmap value blocks for this attr.
>>>>>> @@ -719,12 +719,20 @@ __xfs_attr_rmtval_remove(
>>>>>>     	if (error)
>>>>>>     		return error;
>>>>>> -	error = xfs_defer_finish(&args->trans);
>>>>>> -	if (error)
>>>>>> -		return error;
>>>>>> -
>>>>>> -	if (!done)
>>>>>> +	/*
>>>>>> +	 * We dont need an explicit state here to pick up where we left off.  We
>>>>>> +	 * can figure it out using the !done return code.  Calling function only
>>>>>> +	 * needs to keep recalling this routine until we indicate to stop by
>>>>>> +	 * returning anything other than -EAGAIN. The actual value of
>>>>>> +	 * attr->xattri_dela_state may be some value reminicent of the calling
>>>>>> +	 * function, but it's value is irrelevant with in the context of this
>>>>>> +	 * function.  Once we are done here, the next state is set as needed
>>>>>> +	 * by the parent
>>>>>> +	 */
>>>>>> +	if (!done) {
>>>>>> +		dac->flags |= XFS_DAC_DEFER_FINISH;
>>>>>>     		return -EAGAIN;
>>>>>> +	}
>>>>>>     	return error;
>>>>>>     }
>>>>>> diff --git a/fs/xfs/libxfs/xfs_attr_remote.h b/fs/xfs/libxfs/xfs_attr_remote.h
>>>>>> index 9eee615..002fd30 100644
>>>>>> --- a/fs/xfs/libxfs/xfs_attr_remote.h
>>>>>> +++ b/fs/xfs/libxfs/xfs_attr_remote.h
>>>>>> @@ -14,5 +14,5 @@ int xfs_attr_rmtval_remove(struct xfs_da_args *args);
>>>>>>     int xfs_attr_rmtval_stale(struct xfs_inode *ip, struct xfs_bmbt_irec *map,
>>>>>>     		xfs_buf_flags_t incore_flags);
>>>>>>     int xfs_attr_rmtval_invalidate(struct xfs_da_args *args);
>>>>>> -int __xfs_attr_rmtval_remove(struct xfs_da_args *args);
>>>>>> +int __xfs_attr_rmtval_remove(struct xfs_delattr_context *dac);
>>>>>>     #endif /* __XFS_ATTR_REMOTE_H__ */
>>>>>> diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c
>>>>>> index bfad669..aaa7e66 100644
>>>>>> --- a/fs/xfs/xfs_attr_inactive.c
>>>>>> +++ b/fs/xfs/xfs_attr_inactive.c
>>>>>> @@ -15,10 +15,10 @@
>>>>>>     #include "xfs_da_format.h"
>>>>>>     #include "xfs_da_btree.h"
>>>>>>     #include "xfs_inode.h"
>>>>>> +#include "xfs_attr.h"
>>>>>>     #include "xfs_attr_remote.h"
>>>>>>     #include "xfs_trans.h"
>>>>>>     #include "xfs_bmap.h"
>>>>>> -#include "xfs_attr.h"
>>>>>>     #include "xfs_attr_leaf.h"
>>>>>>     #include "xfs_quota.h"
>>>>>>     #include "xfs_dir2.h"
>>>>>> -- 
>>>>>> 2.7.4
>>>>>>
>>>>>
>>>>
>>>
>>
> 

  reply	other threads:[~2021-03-03  3:17 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-18 16:53 [PATCH v15 00/22] xfs: Delayed Attributes Allison Henderson
2021-02-18 16:53 ` [PATCH v15 01/22] xfs: Add helper xfs_attr_node_remove_step Allison Henderson
2021-02-24 15:03   ` Brian Foster
2021-02-25  6:17     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 02/22] xfs: Add xfs_attr_node_remove_cleanup Allison Henderson
2021-02-24 15:03   ` Brian Foster
2021-02-25  6:17     ` Allison Henderson
2021-02-26  3:00   ` Darrick J. Wong
2021-02-27  0:48     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 03/22] xfs: Hoist transaction handling in xfs_attr_node_remove_step Allison Henderson
2021-02-24 15:04   ` Brian Foster
2021-02-25  6:18     ` Allison Henderson
2021-02-26  3:02   ` Darrick J. Wong
2021-02-27  0:48     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 04/22] xfs: Hoist xfs_attr_set_shortform Allison Henderson
2021-02-24 15:04   ` Brian Foster
2021-02-25  6:18     ` Allison Henderson
2021-02-26  3:03   ` Darrick J. Wong
2021-02-27  0:48     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 05/22] xfs: Add helper xfs_attr_set_fmt Allison Henderson
2021-02-24 15:04   ` Brian Foster
2021-02-25  6:18     ` Allison Henderson
2021-02-26  3:07   ` Darrick J. Wong
2021-02-27  0:49     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 06/22] xfs: Separate xfs_attr_node_addname and xfs_attr_node_addname_work Allison Henderson
2021-02-24 15:04   ` Brian Foster
2021-02-25  6:18     ` Allison Henderson
2021-02-26  4:02   ` Darrick J. Wong
2021-02-27  0:54     ` Allison Henderson
2021-03-01 18:00       ` Darrick J. Wong
2021-03-02  8:26         ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 07/22] xfs: Add helper xfs_attr_node_addname_find_attr Allison Henderson
2021-02-24 15:04   ` Brian Foster
2021-02-25  6:18     ` Allison Henderson
2021-02-26  4:06   ` Darrick J. Wong
2021-02-27  0:54     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 08/22] xfs: Hoist xfs_attr_node_addname Allison Henderson
2021-02-24 18:42   ` Brian Foster
2021-02-25  6:19     ` Allison Henderson
2021-03-01 18:05   ` Darrick J. Wong
2021-03-02  8:26     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 09/22] xfs: Hoist xfs_attr_leaf_addname Allison Henderson
2021-02-24 18:42   ` Brian Foster
2021-02-25  6:19     ` Allison Henderson
2021-02-25 14:20       ` Brian Foster
2021-03-01 18:19   ` Darrick J. Wong
2021-03-02  8:26     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 10/22] xfs: Hoist node transaction handling Allison Henderson
2021-02-24 18:43   ` Brian Foster
2021-02-25  6:20     ` Allison Henderson
2021-03-01 18:20   ` Darrick J. Wong
2021-03-02  8:26     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 11/22] xfs: Add delay ready attr remove routines Allison Henderson
2021-02-24 18:45   ` Brian Foster
2021-02-25  7:01     ` Allison Henderson
2021-02-25 14:22       ` Brian Foster
2021-02-25 22:28         ` Allison Henderson
2021-02-28 15:39           ` Brian Foster
2021-03-02  8:26             ` Allison Henderson [this message]
2021-02-18 16:53 ` [PATCH v15 12/22] xfs: Add delay ready attr set routines Allison Henderson
2021-03-02  1:39   ` Darrick J. Wong
2021-02-18 16:53 ` [PATCH v15 13/22] xfs: Add state machine tracepoints Allison Henderson
2021-02-26  5:06   ` Darrick J. Wong
2021-02-27  0:57     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 14/22] xfs: Rename __xfs_attr_rmtval_remove Allison Henderson
2021-02-18 16:53 ` [PATCH v15 15/22] xfs: Handle krealloc errors in xlog_recover_add_to_cont_trans Allison Henderson
2021-02-26  5:06   ` Darrick J. Wong
2021-02-27  0:57     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 16/22] xfs: Set up infastructure for deferred attribute operations Allison Henderson
2021-02-26  4:58   ` Darrick J. Wong
2021-02-27  0:56     ` Allison Henderson
2021-03-02  7:13       ` Allison Henderson
2021-03-03 11:50         ` Brian Foster
2021-02-18 16:53 ` [PATCH v15 17/22] xfs: Skip flip flags for delayed attrs Allison Henderson
2021-02-26  5:02   ` Darrick J. Wong
2021-02-27  0:56     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 18/22] xfs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred Allison Henderson
2021-02-26  5:00   ` Darrick J. Wong
2021-02-27  0:57     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 19/22] xfs: Remove unused xfs_attr_*_args Allison Henderson
2021-02-26  4:58   ` Darrick J. Wong
2021-02-27  0:57     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 20/22] xfs: Add delayed attributes error tag Allison Henderson
2021-02-18 16:53 ` [PATCH v15 21/22] xfs: Add delattr mount option Allison Henderson
2021-02-26  4:29   ` Darrick J. Wong
2021-02-27  0:55     ` Allison Henderson
2021-02-18 16:53 ` [PATCH v15 22/22] xfs: Merge xfs_delattr_context into xfs_attr_item Allison Henderson

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=3f82db7d-b8b3-c490-da9a-7100c47eca47@oracle.com \
    --to=allison.henderson@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 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).