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:
parent
d68c51e9a4
commit
cd1549d6df
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user