Commit cd1549d6 authored by Allison Henderson's avatar Allison Henderson Committed by Dave Chinner

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: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent d68c51e9
...@@ -286,6 +286,65 @@ xfs_attr_sf_addname( ...@@ -286,6 +286,65 @@ xfs_attr_sf_addname(
return -EAGAIN; 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. * Set the attribute specified in @args.
* This routine is meant to function as a delayed operation, and may return * This routine is meant to function as a delayed operation, and may return
...@@ -321,57 +380,8 @@ xfs_attr_set_iter( ...@@ -321,57 +380,8 @@ xfs_attr_set_iter(
attr->xattri_leaf_bp = NULL; attr->xattri_leaf_bp = NULL;
} }
if (xfs_attr_is_leaf(dp)) { return xfs_attr_leaf_addname(attr);
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;
} 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: case XFS_DAS_FOUND_LBLK:
/* /*
* If there was an out-of-line value, allocate the blocks we * If there was an out-of-line value, allocate the blocks we
......
...@@ -4150,6 +4150,7 @@ DEFINE_EVENT(xfs_das_state_class, name, \ ...@@ -4150,6 +4150,7 @@ DEFINE_EVENT(xfs_das_state_class, name, \
TP_ARGS(das, ip)) TP_ARGS(das, ip))
DEFINE_DAS_STATE_EVENT(xfs_attr_sf_addname_return); DEFINE_DAS_STATE_EVENT(xfs_attr_sf_addname_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_set_iter_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_node_addname_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return); DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return); DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment