On Wed, Jul 07, 2021 at 03:21:11PM -0700, Allison Henderson wrote: > This patch adds a helper function xfs_attr_leaf_addname. While this > does help to break down xfs_attr_set_iter, it does also hoist out some > of the state management. This patch has been moved to the end of the > clean up series for further discussion. > > Suggested-by: Darrick J. Wong <djwong@xxxxxxxxxx> > Signed-off-by: Allison Henderson <allison.henderson@xxxxxxxxxx> > --- > fs/xfs/libxfs/xfs_attr.c | 107 ++++++++++++++++++++++++++--------------------- > fs/xfs/xfs_trace.h | 1 + > 2 files changed, 60 insertions(+), 48 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c > index cb7e689..80486b4 100644 > --- a/fs/xfs/libxfs/xfs_attr.c > +++ b/fs/xfs/libxfs/xfs_attr.c > @@ -284,6 +284,64 @@ xfs_attr_sf_addname( > return -EAGAIN; > } > > +STATIC int > +xfs_attr_leaf_addname( > + struct xfs_attr_item *attr) > +{ > + struct xfs_da_args *args = attr->xattri_da_args; > + struct xfs_buf *leaf_bp = attr->xattri_leaf_bp; > + struct xfs_inode *dp = args->dp; > + int error; > + > + if (xfs_attr_is_leaf(dp)) { > + error = xfs_attr_leaf_try_add(args, leaf_bp); > + if (error == -ENOSPC) { > + error = xfs_attr3_leaf_to_node(args); > + if (error) > + return error; > + > + /* > + * Finish any deferred work items and roll the > + * transaction once more. The goal here is to call > + * node_addname with the inode and transaction in the > + * same state (inode locked and joined, transaction > + * clean) no matter how we got to this step. > + * > + * At this point, we are still in XFS_DAS_UNINIT, but > + * when we come back, we'll be a node, so we'll fall > + * down into the node handling code below > + */ > + trace_xfs_attr_set_iter_return( > + attr->xattri_dela_state, args->dp); > + return -EAGAIN; > + } else if (error) { Silly nit: No need for else if, regular if works fine here. Oh, hm, this is just a hoist patch, and we're not supposed to hoist-and-mutate. But this is a small change, so fmeh rules. With that tidied, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > + return error; > + } > + > + attr->xattri_dela_state = XFS_DAS_FOUND_LBLK; > + } else { > + error = xfs_attr_node_addname_find_attr(attr); > + if (error) > + return error; > + > + error = xfs_attr_node_addname(attr); > + if (error) > + return error; > + > + /* > + * If addname was successful, and we dont need to alloc or > + * remove anymore blks, we're done. > + */ > + if (!args->rmtblkno && !args->rmtblkno2) > + return error; > + > + attr->xattri_dela_state = XFS_DAS_FOUND_NBLK; > + } > + > + trace_xfs_attr_leaf_addname_return(attr->xattri_dela_state, args->dp); > + return -EAGAIN; > +} > + > /* > * Set the attribute specified in @args. > * This routine is meant to function as a delayed operation, and may return > @@ -319,55 +377,8 @@ xfs_attr_set_iter( > *leaf_bp = NULL; > } > > - if (xfs_attr_is_leaf(dp)) { > - error = xfs_attr_leaf_try_add(args, *leaf_bp); > - if (error == -ENOSPC) { > - error = xfs_attr3_leaf_to_node(args); > - if (error) > - return error; > - > - /* > - * Finish any deferred work items and roll the > - * transaction once more. The goal here is to > - * call node_addname with the inode and > - * transaction in the same state (inode locked > - * and joined, transaction clean) no matter how > - * we got to this step. > - * > - * At this point, we are still in > - * XFS_DAS_UNINIT, but when we come back, we'll > - * be a node, so we'll fall down into the node > - * handling code below > - */ > - trace_xfs_attr_set_iter_return( > - attr->xattri_dela_state, args->dp); > - return -EAGAIN; > - } else if (error) { > - return error; > - } > - > - attr->xattri_dela_state = XFS_DAS_FOUND_LBLK; > - } else { > - error = xfs_attr_node_addname_find_attr(attr); > - if (error) > - return error; > + return xfs_attr_leaf_addname(attr); > > - error = xfs_attr_node_addname(attr); > - if (error) > - return error; > - > - /* > - * If addname was successful, and we dont need to alloc > - * or remove anymore blks, we're done. > - */ > - if (!args->rmtblkno && !args->rmtblkno2) > - return error; > - > - attr->xattri_dela_state = XFS_DAS_FOUND_NBLK; > - } > - trace_xfs_attr_set_iter_return(attr->xattri_dela_state, > - args->dp); > - return -EAGAIN; > case XFS_DAS_FOUND_LBLK: > /* > * If there was an out-of-line value, allocate the blocks we > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index f9840dd..cf8bd3a 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -4008,6 +4008,7 @@ DEFINE_EVENT(xfs_das_state_class, name, \ > TP_ARGS(das, ip)) > DEFINE_DAS_STATE_EVENT(xfs_attr_sf_addname_return); > DEFINE_DAS_STATE_EVENT(xfs_attr_set_iter_return); > +DEFINE_DAS_STATE_EVENT(xfs_attr_leaf_addname_return); > DEFINE_DAS_STATE_EVENT(xfs_attr_node_addname_return); > DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return); > DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return); > -- > 2.7.4 >