xfs: Add helper function xfs_attr_leaf_addname

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@kernel.org>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Allison Henderson 2022-05-11 17:01:22 +10:00 committed by Dave Chinner
parent d68c51e9a4
commit cd1549d6df
2 changed files with 61 additions and 50 deletions

View File

@ -286,6 +286,65 @@ 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_inode *dp = args->dp;
int error;
if (xfs_attr_is_leaf(dp)) {
error = xfs_attr_leaf_try_add(args, attr->xattri_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;
}
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;
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->op_flags & XFS_DA_OP_RENAME))
return 0;
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
@ -321,57 +380,8 @@ xfs_attr_set_iter(
attr->xattri_leaf_bp = NULL;
}
if (xfs_attr_is_leaf(dp)) {
error = xfs_attr_leaf_try_add(args,
attr->xattri_leaf_bp);
if (error == -ENOSPC) {
error = xfs_attr3_leaf_to_node(args);
if (error)
return error;
return xfs_attr_leaf_addname(attr);
/*
* 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;
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->op_flags & XFS_DA_OP_RENAME))
return 0;
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

View File

@ -4150,6 +4150,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);