All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: Allison Collins <allison.henderson@oracle.com>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH v7 03/19] xfs: Add xfs_has_attr and subroutines
Date: Tue, 25 Feb 2020 08:25:21 -0500	[thread overview]
Message-ID: <20200225132521.GA21304@bfoster> (raw)
In-Reply-To: <2871cf8f-5bef-7e0a-33d0-c58a14763be8@oracle.com>

On Mon, Feb 24, 2020 at 02:18:35PM -0700, Allison Collins wrote:
> 
> 
> On 2/24/20 6:08 AM, Brian Foster wrote:
> > On Sat, Feb 22, 2020 at 07:05:55PM -0700, Allison Collins wrote:
> > > From: Allison Henderson <allison.henderson@oracle.com>
> > > 
> > > This patch adds a new functions to check for the existence of an attribute.
> > > Subroutines are also added to handle the cases of leaf blocks, nodes or shortform.
> > > Common code that appears in existing attr add and remove functions have been
> > > factored out to help reduce the appearance of duplicated code.  We will need these
> > > routines later for delayed attributes since delayed operations cannot return error
> > > codes.
> > > 
> > > Signed-off-by: Allison Collins <allison.henderson@oracle.com>
> > > ---
> > >   fs/xfs/libxfs/xfs_attr.c      | 171 ++++++++++++++++++++++++++++--------------
> > >   fs/xfs/libxfs/xfs_attr.h      |   1 +
> > >   fs/xfs/libxfs/xfs_attr_leaf.c | 111 +++++++++++++++++----------
> > >   fs/xfs/libxfs/xfs_attr_leaf.h |   3 +
> > >   4 files changed, 188 insertions(+), 98 deletions(-)
> > > 
> > > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
> > > index 9acdb23..2255060 100644
> > > --- a/fs/xfs/libxfs/xfs_attr.c
> > > +++ b/fs/xfs/libxfs/xfs_attr.c
> > ...
> > > @@ -310,6 +313,37 @@ xfs_attr_set_args(
> > >   }
> > >   /*
> > > + * Return EEXIST if attr is found, or ENOATTR if not
> > > + */
> > > +int
> > > +xfs_has_attr(
> > > +	struct xfs_da_args      *args)
> > > +{
> > > +	struct xfs_inode	*dp = args->dp;
> > > +	struct xfs_buf		*bp = NULL;
> > > +	int			error;
> > > +
> > > +	if (!xfs_inode_hasattr(dp))
> > > +		return -ENOATTR;
> > > +
> > > +	if (dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) {
> > > +		ASSERT(dp->i_afp->if_flags & XFS_IFINLINE);
> > > +		return xfs_attr_sf_findname(args, NULL, NULL);
> > 
> > Nit: any reason we use "findname" here and "hasname" for the other two
> > variants?
> It was asked for in the v4 review.  Reason being we also return the location
> of the sf entry and byte offset.
> 

Ok.

> > 
> > Just a few other nit level things..
> > 
> > > +	}
> > > +
> > > +	if (xfs_bmap_one_block(dp, XFS_ATTR_FORK)) {
> > > +		error = xfs_attr_leaf_hasname(args, &bp);
> > > +
> > > +		if (bp)
> > > +			xfs_trans_brelse(args->trans, bp);
> > > +
> > > +		return error;
> > > +	}
> > > +
> > > +	return xfs_attr_node_hasname(args, NULL);
> > > +}
> > > +
> > > +/*
> > >    * Remove the attribute specified in @args.
> > >    */
> > >   int
> > ...
> > > @@ -773,12 +822,11 @@ xfs_attr_leaf_removename(
> > >   	 * Remove the attribute.
> > >   	 */
> > >   	dp = args->dp;
> > > -	args->blkno = 0;
> > > -	error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
> > > -	if (error)
> > > +
> > > +	error = xfs_attr_leaf_hasname(args, &bp);
> > > +	if (error != -ENOATTR && error != -EEXIST)
> > >   		return error;
> > > -	error = xfs_attr3_leaf_lookup_int(bp, args);
> > >   	if (error == -ENOATTR) {
> > 
> > It looks like some of these error checks could be cleaned up where the
> > helper function is used. I.e., something like the following here:
> > 
> > 	if (error == -ENOATTR) {
> > 		xfs_trans_brelse(...);
> > 		return error;
> > 	} else if (error != -EEXIST)
> > 		return error;
> Sure, I'm starting to get more pressure in other reviews to change this api
> to a boolean return type though (1: y, 0: no, <0: error).  I think we talked
> about this in v3, but decided to stick with this original api for now.  I'm
> thinking maybe adding a patch at the end to shift the api might be a good
> compromise?  Thoughts?
> 

I think Dave commented on this earlier with regard to some of these API
cleanups being orthogonal to this work. The big challenge with this
series is really taking apart this big tangle of xattr code such that it
has smaller components and is thus mostly reusable between dfops context
for parent pointers etc. and the traditional codepath. I can see the
appeal of such API cleanups (so it's good feedback overall), but I agree
that it's probably wiser to allow this series to work with the interface
style we have in the existing code and consider that type of thing as a
follow on cleanup when the subsystem itself is more stabilized.

Brian

> > 
> > >   		xfs_trans_brelse(args->trans, bp);
> > >   		return error;
> > > @@ -817,12 +865,10 @@ xfs_attr_leaf_get(xfs_da_args_t *args)
> > >   	trace_xfs_attr_leaf_get(args);
> > > -	args->blkno = 0;
> > > -	error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, &bp);
> > > -	if (error)
> > > +	error = xfs_attr_leaf_hasname(args, &bp);
> > > +	if (error != -ENOATTR && error != -EEXIST)
> > >   		return error;
> > > -	error = xfs_attr3_leaf_lookup_int(bp, args);
> > >   	if (error != -EEXIST)  {
> > >   		xfs_trans_brelse(args->trans, bp);
> > >   		return error;
> > 
> > Similar thing here, just reordering the checks simplifies the logic.
> Sure, will do.
> 
> > 
> > > @@ -832,6 +878,41 @@ xfs_attr_leaf_get(xfs_da_args_t *args)
> > >   	return error;
> > >   }
> > > +/*
> > > + * Return EEXIST if attr is found, or ENOATTR if not
> > > + * statep: If not null is set to point at the found state.  Caller will
> > > + *         be responsible for freeing the state in this case.
> > > + */
> > > +STATIC int
> > > +xfs_attr_node_hasname(
> > > +	struct xfs_da_args	*args,
> > > +	struct xfs_da_state	**statep)
> > > +{
> > > +	struct xfs_da_state	*state;
> > > +	int			retval, error;
> > > +
> > > +	state = xfs_da_state_alloc();
> > > +	state->args = args;
> > > +	state->mp = args->dp->i_mount;
> > > +
> > > +	if (statep != NULL)
> > > +		*statep = NULL;
> > > +
> > > +	/*
> > > +	 * Search to see if name exists, and get back a pointer to it.
> > > +	 */
> > > +	error = xfs_da3_node_lookup_int(state, &retval);
> > > +	if (error == 0) {
> > > +		if (statep != NULL)
> > > +			*statep = state;
> > > +		return retval;
> > > +	}
> > > +
> > > +	xfs_da_state_free(state);
> > > +
> > > +	return error;
> > > +}
> > > +
> > >   /*========================================================================
> > >    * External routines when attribute list size > geo->blksize
> > >    *========================================================================*/
> > ...
> > > @@ -1316,31 +1381,23 @@ xfs_attr_node_get(xfs_da_args_t *args)
> > >   {
> > >   	xfs_da_state_t *state;
> > >   	xfs_da_state_blk_t *blk;
> > > -	int error, retval;
> > > +	int error;
> > >   	int i;
> > >   	trace_xfs_attr_node_get(args);
> > > -	state = xfs_da_state_alloc();
> > > -	state->args = args;
> > > -	state->mp = args->dp->i_mount;
> > > -
> > >   	/*
> > >   	 * Search to see if name exists, and get back a pointer to it.
> > >   	 */
> > > -	error = xfs_da3_node_lookup_int(state, &retval);
> > > -	if (error) {
> > > -		retval = error;
> > > -		goto out_release;
> > > -	}
> > > -	if (retval != -EEXIST)
> > > +	error = xfs_attr_node_hasname(args, &state);
> > > +	if (error != -EEXIST)
> > >   		goto out_release;
> > >   	/*
> > >   	 * Get the value, local or "remote"
> > >   	 */
> > >   	blk = &state->path.blk[state->path.active - 1];
> > > -	retval = xfs_attr3_leaf_getvalue(blk->bp, args);
> > > +	error = xfs_attr3_leaf_getvalue(blk->bp, args);
> > >   	/*
> > >   	 * If not in a transaction, we have to release all the buffers.
> > > @@ -1352,7 +1409,7 @@ xfs_attr_node_get(xfs_da_args_t *args)
> > >   	}
> > >   	xfs_da_state_free(state);
> > 
> > Do we need an 'if (state)' check here like the other node funcs?
> I think so, because if xfs_attr_node_hasname errors out it releases the
> state.  Will add.
> 
> > 
> > > -	return retval;
> > > +	return error;
> > >   }
> > >   /* Returns true if the attribute entry name is valid. */
> > ...
> > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
> > > index cb5ef66..9d6b68c 100644
> > > --- a/fs/xfs/libxfs/xfs_attr_leaf.c
> > > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c
> > > @@ -654,18 +654,66 @@ xfs_attr_shortform_create(xfs_da_args_t *args)
> > >   }
> > >   /*
> > > + * Return -EEXIST if attr is found, or -ENOATTR if not
> > > + * args:  args containing attribute name and namelen
> > > + * sfep:  If not null, pointer will be set to the last attr entry found on
> > > +	  -EEXIST.  On -ENOATTR pointer is left at the last entry in the list
> > > + * basep: If not null, pointer is set to the byte offset of the entry in the
> > > + *	  list on -EEXIST.  On -ENOATTR, pointer is left at the byte offset of
> > > + *	  the last entry in the list
> > > + */
> > > +int
> > > +xfs_attr_sf_findname(
> > > +	struct xfs_da_args	 *args,
> > > +	struct xfs_attr_sf_entry **sfep,
> > > +	unsigned int		 *basep)
> > > +{
> > > +	struct xfs_attr_shortform *sf;
> > > +	struct xfs_attr_sf_entry *sfe;
> > > +	unsigned int		base = sizeof(struct xfs_attr_sf_hdr);
> > > +	int			size = 0;
> > > +	int			end;
> > > +	int			i;
> > > +
> > > +	sf = (struct xfs_attr_shortform *)args->dp->i_afp->if_u1.if_data;
> > > +	sfe = &sf->list[0];
> > > +	end = sf->hdr.count;
> > > +	for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe),
> > > +			base += size, i++) {
> > 
> > Slightly more readable to align indendation with the sfe assignment
> > above.
> Sure, will fix.  Thanks!
> 
> Allison
> 
> > 
> > Brian
> > 
> > > +		size = XFS_ATTR_SF_ENTSIZE(sfe);
> > > +		if (sfe->namelen != args->name.len)
> > > +			continue;
> > > +		if (memcmp(sfe->nameval, args->name.name, args->name.len) != 0)
> > > +			continue;
> > > +		if (!xfs_attr_namesp_match(args->name.type, sfe->flags))
> > > +			continue;
> > > +		break;
> > > +	}
> > > +
> > > +	if (sfep != NULL)
> > > +		*sfep = sfe;
> > > +
> > > +	if (basep != NULL)
> > > +		*basep = base;
> > > +
> > > +	if (i == end)
> > > +		return -ENOATTR;
> > > +	return -EEXIST;
> > > +}
> > > +
> > > +/*
> > >    * Add a name/value pair to the shortform attribute list.
> > >    * Overflow from the inode has already been checked for.
> > >    */
> > >   void
> > > -xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff)
> > > +xfs_attr_shortform_add(struct xfs_da_args *args, int forkoff)
> > >   {
> > > -	xfs_attr_shortform_t *sf;
> > > -	xfs_attr_sf_entry_t *sfe;
> > > -	int i, offset, size;
> > > -	xfs_mount_t *mp;
> > > -	xfs_inode_t *dp;
> > > -	struct xfs_ifork *ifp;
> > > +	struct xfs_attr_shortform	*sf;
> > > +	struct xfs_attr_sf_entry	*sfe;
> > > +	int				offset, size, error;
> > > +	struct xfs_mount		*mp;
> > > +	struct xfs_inode		*dp;
> > > +	struct xfs_ifork		*ifp;
> > >   	trace_xfs_attr_sf_add(args);
> > > @@ -676,18 +724,8 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff)
> > >   	ifp = dp->i_afp;
> > >   	ASSERT(ifp->if_flags & XFS_IFINLINE);
> > >   	sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
> > > -	sfe = &sf->list[0];
> > > -	for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
> > > -#ifdef DEBUG
> > > -		if (sfe->namelen != args->name.len)
> > > -			continue;
> > > -		if (memcmp(args->name.name, sfe->nameval, args->name.len) != 0)
> > > -			continue;
> > > -		if (!xfs_attr_namesp_match(args->name.type, sfe->flags))
> > > -			continue;
> > > -		ASSERT(0);
> > > -#endif
> > > -	}
> > > +	error = xfs_attr_sf_findname(args, &sfe, NULL);
> > > +	ASSERT(error != -EEXIST);
> > >   	offset = (char *)sfe - (char *)sf;
> > >   	size = XFS_ATTR_SF_ENTSIZE_BYNAME(args->name.len, args->valuelen);
> > > @@ -730,35 +768,26 @@ xfs_attr_fork_remove(
> > >    * Remove an attribute from the shortform attribute list structure.
> > >    */
> > >   int
> > > -xfs_attr_shortform_remove(xfs_da_args_t *args)
> > > +xfs_attr_shortform_remove(struct xfs_da_args *args)
> > >   {
> > > -	xfs_attr_shortform_t *sf;
> > > -	xfs_attr_sf_entry_t *sfe;
> > > -	int base, size=0, end, totsize, i;
> > > -	xfs_mount_t *mp;
> > > -	xfs_inode_t *dp;
> > > +	struct xfs_attr_shortform	*sf;
> > > +	struct xfs_attr_sf_entry	*sfe;
> > > +	int				size = 0, end, totsize;
> > > +	unsigned int			base;
> > > +	struct xfs_mount		*mp;
> > > +	struct xfs_inode		*dp;
> > > +	int				error;
> > >   	trace_xfs_attr_sf_remove(args);
> > >   	dp = args->dp;
> > >   	mp = dp->i_mount;
> > > -	base = sizeof(xfs_attr_sf_hdr_t);
> > >   	sf = (xfs_attr_shortform_t *)dp->i_afp->if_u1.if_data;
> > > -	sfe = &sf->list[0];
> > > -	end = sf->hdr.count;
> > > -	for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe),
> > > -					base += size, i++) {
> > > -		size = XFS_ATTR_SF_ENTSIZE(sfe);
> > > -		if (sfe->namelen != args->name.len)
> > > -			continue;
> > > -		if (memcmp(sfe->nameval, args->name.name, args->name.len) != 0)
> > > -			continue;
> > > -		if (!xfs_attr_namesp_match(args->name.type, sfe->flags))
> > > -			continue;
> > > -		break;
> > > -	}
> > > -	if (i == end)
> > > -		return -ENOATTR;
> > > +
> > > +	error = xfs_attr_sf_findname(args, &sfe, &base);
> > > +	if (error != -EEXIST)
> > > +		return error;
> > > +	size = XFS_ATTR_SF_ENTSIZE(sfe);
> > >   	/*
> > >   	 * Fix up the attribute fork data, covering the hole
> > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.h b/fs/xfs/libxfs/xfs_attr_leaf.h
> > > index 73615b1..0e9c87c 100644
> > > --- a/fs/xfs/libxfs/xfs_attr_leaf.h
> > > +++ b/fs/xfs/libxfs/xfs_attr_leaf.h
> > > @@ -53,6 +53,9 @@ int	xfs_attr_shortform_getvalue(struct xfs_da_args *args);
> > >   int	xfs_attr_shortform_to_leaf(struct xfs_da_args *args,
> > >   			struct xfs_buf **leaf_bp);
> > >   int	xfs_attr_shortform_remove(struct xfs_da_args *args);
> > > +int	xfs_attr_sf_findname(struct xfs_da_args *args,
> > > +			     struct xfs_attr_sf_entry **sfep,
> > > +			     unsigned int *basep);
> > >   int	xfs_attr_shortform_allfit(struct xfs_buf *bp, struct xfs_inode *dp);
> > >   int	xfs_attr_shortform_bytesfit(struct xfs_inode *dp, int bytes);
> > >   xfs_failaddr_t xfs_attr_shortform_verify(struct xfs_inode *ip);
> > > -- 
> > > 2.7.4
> > > 
> > 
> 


  reply	other threads:[~2020-02-25 13:25 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-23  2:05 [PATCH v7 00/19] xfs: Delayed Ready Attrs Allison Collins
2020-02-23  2:05 ` [PATCH v7 01/19] xfs: Replace attribute parameters with struct xfs_name Allison Collins
2020-02-23  9:34   ` Amir Goldstein
2020-02-23 16:03     ` Allison Collins
2020-02-25  0:49       ` Dave Chinner
2020-02-24 12:08   ` Chandan Rajendra
2020-02-24 16:25     ` Allison Collins
2020-02-24 13:06   ` Brian Foster
2020-02-24 16:25     ` Allison Collins
2020-02-23  2:05 ` [PATCH v7 02/19] xfs: Embed struct xfs_name in xfs_da_args Allison Collins
2020-02-23 11:54   ` Amir Goldstein
2020-02-23 16:51     ` Allison Collins
2020-02-24  6:50       ` Amir Goldstein
2020-02-24  7:36         ` Allison Collins
2020-02-24  7:43           ` Amir Goldstein
2020-02-25  0:57   ` Dave Chinner
2020-02-25  2:00     ` Allison Collins
2020-02-25  4:06       ` Dave Chinner
2020-02-25  4:19         ` Allison Collins
2020-02-25  4:27           ` Darrick J. Wong
2020-02-25  6:07             ` Allison Collins
2020-02-25  6:30               ` Dave Chinner
2020-02-25 17:21             ` Christoph Hellwig
2020-02-25  6:56   ` Chandan Rajendra
2020-02-25 23:26     ` Allison Collins
2020-02-23  2:05 ` [PATCH v7 03/19] xfs: Add xfs_has_attr and subroutines Allison Collins
2020-02-23 12:20   ` Amir Goldstein
2020-02-23 17:28     ` Allison Collins
2020-02-24  6:58       ` Amir Goldstein
2020-02-25  6:26     ` Dave Chinner
2020-02-25  6:43       ` Amir Goldstein
2020-02-25 22:27         ` Dave Chinner
2020-02-24 13:08   ` Brian Foster
2020-02-24 21:18     ` Allison Collins
2020-02-25 13:25       ` Brian Foster [this message]
2020-02-26  2:31         ` Allison Collins
2020-02-25  9:49   ` Chandan Rajendra
2020-02-25 10:15     ` Chandan Rajendra
2020-02-26  2:19       ` Allison Collins
2020-02-26  2:18     ` Allison Collins
2020-02-23  2:05 ` [PATCH v7 04/19] xfs: Check for -ENOATTR or -EEXIST Allison Collins
2020-02-23 12:25   ` Amir Goldstein
2020-02-23 17:33     ` Allison Collins
2020-02-24 13:08   ` Brian Foster
2020-02-24 21:18     ` Allison Collins
2020-02-23  2:05 ` [PATCH v7 05/19] xfs: Factor out new helper functions xfs_attr_rmtval_set Allison Collins
2020-02-25 12:53   ` Chandan Rajendra
2020-02-26  2:20     ` Allison Collins
2020-02-23  2:05 ` [PATCH v7 06/19] xfs: Factor out trans handling in xfs_attr3_leaf_flipflags Allison Collins
2020-02-23 12:30   ` Amir Goldstein
2020-02-23 17:36     ` Allison Collins
2020-02-28  4:56   ` Chandan Rajendra
2020-02-23  2:05 ` [PATCH v7 07/19] xfs: Factor out xfs_attr_leaf_addname helper Allison Collins
2020-02-23 12:42   ` Amir Goldstein
2020-02-23 18:38     ` Allison Collins
2020-02-24  6:38       ` Amir Goldstein
2020-02-24  7:09         ` Allison Collins
2020-02-24  7:27           ` Amir Goldstein
2020-02-25  6:42   ` Dave Chinner
2020-02-25 13:26     ` Brian Foster
2020-02-25 23:26     ` Allison Collins
2020-02-28  6:51   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 08/19] xfs: Refactor xfs_attr_try_sf_addname Allison Collins
2020-02-23 13:04   ` Amir Goldstein
2020-02-23 17:51     ` Allison Collins
2020-02-24 13:08   ` Brian Foster
2020-02-24 21:19     ` Allison Collins
2020-02-28  7:42   ` Chandan Rajendra
2020-02-28 18:14     ` Allison Collins
2020-02-23  2:06 ` [PATCH v7 09/19] xfs: Factor out trans roll from xfs_attr3_leaf_setflag Allison Collins
2020-02-28  7:59   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 10/19] xfs: Factor out xfs_attr_rmtval_invalidate Allison Collins
2020-02-28 10:42   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 11/19] xfs: Factor out trans roll in xfs_attr3_leaf_clearflag Allison Collins
2020-02-28 10:56   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 12/19] xfs: Add helper function xfs_attr_rmtval_unmap Allison Collins
2020-02-24 13:40   ` Brian Foster
2020-02-24 21:44     ` Allison Collins
2020-02-25 13:27       ` Brian Foster
2020-02-26  3:29         ` Allison Collins
2020-02-26 13:47           ` Brian Foster
2020-02-25  7:21   ` Dave Chinner
2020-02-25 23:27     ` Allison Collins
2020-02-28 14:22   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 13/19] xfs: Add delay ready attr remove routines Allison Collins
2020-02-24 15:25   ` Brian Foster
2020-02-24 17:03     ` Brian Foster
2020-02-24 23:14     ` Allison Collins
2020-02-24 23:56       ` Darrick J. Wong
2020-02-25 13:34       ` Brian Foster
2020-02-26  5:36         ` Allison Collins
2020-02-26 13:48           ` Brian Foster
2020-02-26 19:23             ` Allison Collins
2020-02-25  8:57   ` Dave Chinner
2020-02-26  0:57     ` Allison Collins
2020-02-26 22:34       ` Dave Chinner
2020-02-27  4:18         ` Allison Collins
2020-03-03  5:03   ` Chandan Rajendra
2020-03-03  5:40     ` Allison Collins
2020-02-23  2:06 ` [PATCH v7 14/19] xfs: Add delay ready attr set routines Allison Collins
2020-03-03 13:41   ` Chandan Rajendra
2020-03-03 17:07     ` Allison Collins
2020-02-23  2:06 ` [PATCH v7 15/19] xfs: Add helper function xfs_attr_node_shrink Allison Collins
2020-02-23 13:22   ` Amir Goldstein
2020-02-23 18:41     ` Allison Collins
2020-02-25  9:05   ` Dave Chinner
2020-02-26  1:48     ` Allison Collins
2020-02-23  2:06 ` [PATCH v7 16/19] xfs: Simplify xfs_attr_set_iter Allison Collins
2020-02-23 13:26   ` Amir Goldstein
2020-02-23 18:42     ` Allison Collins
2020-02-25  9:21   ` Dave Chinner
2020-02-26  2:13     ` Allison Collins
2020-02-26 22:39       ` Dave Chinner
2020-03-04  4:30   ` Chandan Rajendra
2020-03-04 17:04     ` Allison Collins
2020-03-05  3:39       ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 17/19] xfs: Add helper function xfs_attr_leaf_mark_incomplete Allison Collins
2020-02-23 13:47   ` Amir Goldstein
2020-02-23 18:43     ` Allison Collins
2020-02-25  9:31   ` Dave Chinner
2020-02-26  2:17     ` Allison Collins
2020-03-04  4:37   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 18/19] xfs: Add remote block helper functions Allison Collins
2020-02-23 13:45   ` Amir Goldstein
2020-03-04  4:59   ` Chandan Rajendra
2020-02-23  2:06 ` [PATCH v7 19/19] xfs: Remove xfs_attr_rmtval_remove Allison Collins
2020-02-23 13:54   ` Amir Goldstein
2020-02-23 18:50     ` Allison Collins
2020-02-23  7:55 ` [PATCH v7 00/19] xfs: Delayed Ready Attrs Amir Goldstein
2020-02-23 16:02   ` Allison Collins
2020-02-24  6:30     ` Amir Goldstein
2020-02-24 16:23       ` Allison Collins
2020-02-25  5:53         ` Amir Goldstein
2020-02-24  8:31   ` Chandan Rajendra
2020-02-25  9:52   ` 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=20200225132521.GA21304@bfoster \
    --to=bfoster@redhat.com \
    --cc=allison.henderson@oracle.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.