Commit bf4a5cff authored by Allison Collins's avatar Allison Collins Committed by Darrick J. Wong

xfs: Simplify xfs_attr_node_addname

Invert the rename logic in xfs_attr_node_addname to simplify the
delayed attr logic later.
Signed-off-by: default avatarAllison Collins <allison.henderson@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Acked-by: default avatarDave Chinner <dchinner@redhat.com>
parent 5fdca0ad
...@@ -1025,79 +1025,75 @@ xfs_attr_node_addname( ...@@ -1025,79 +1025,75 @@ xfs_attr_node_addname(
return error; return error;
} }
/* if (!(args->op_flags & XFS_DA_OP_RENAME)) {
* If this is an atomic rename operation, we must "flip" the
* incomplete flags on the "new" and "old" attribute/value pairs
* so that one disappears and one appears atomically. Then we
* must remove the "old" attribute/value pair.
*/
if (args->op_flags & XFS_DA_OP_RENAME) {
/*
* In a separate transaction, set the incomplete flag on the
* "old" attr and clear the incomplete flag on the "new" attr.
*/
error = xfs_attr3_leaf_flipflags(args);
if (error)
goto out;
/*
* Commit the flag value change and start the next trans in
* series
*/
error = xfs_trans_roll_inode(&args->trans, args->dp);
if (error)
goto out;
/* /*
* Dismantle the "old" attribute/value pair by removing * Added a "remote" value, just clear the incomplete flag.
* a "remote" value (if it exists).
*/ */
xfs_attr_restore_rmt_blk(args); if (args->rmtblkno > 0)
error = xfs_attr3_leaf_clearflag(args);
retval = error;
goto out;
}
if (args->rmtblkno) { /*
error = xfs_attr_rmtval_invalidate(args); * If this is an atomic rename operation, we must "flip" the incomplete
if (error) * flags on the "new" and "old" attribute/value pairs so that one
return error; * disappears and one appears atomically. Then we must remove the "old"
* attribute/value pair.
*
* In a separate transaction, set the incomplete flag on the "old" attr
* and clear the incomplete flag on the "new" attr.
*/
error = xfs_attr3_leaf_flipflags(args);
if (error)
goto out;
/*
* Commit the flag value change and start the next trans in series
*/
error = xfs_trans_roll_inode(&args->trans, args->dp);
if (error)
goto out;
error = xfs_attr_rmtval_remove(args); /*
if (error) * Dismantle the "old" attribute/value pair by removing a "remote" value
return error; * (if it exists).
} */
xfs_attr_restore_rmt_blk(args);
/* if (args->rmtblkno) {
* Re-find the "old" attribute entry after any split ops. error = xfs_attr_rmtval_invalidate(args);
* The INCOMPLETE flag means that we will find the "old" if (error)
* attr, not the "new" one. return error;
*/
args->attr_filter |= XFS_ATTR_INCOMPLETE;
state = xfs_da_state_alloc(args);
state->inleaf = 0; error = xfs_attr_rmtval_remove(args);
error = xfs_da3_node_lookup_int(state, &retval);
if (error) if (error)
goto out; return error;
}
/* /*
* Remove the name and update the hashvals in the tree. * Re-find the "old" attribute entry after any split ops. The INCOMPLETE
*/ * flag means that we will find the "old" attr, not the "new" one.
blk = &state->path.blk[ state->path.active-1 ]; */
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); args->attr_filter |= XFS_ATTR_INCOMPLETE;
error = xfs_attr3_leaf_remove(blk->bp, args); state = xfs_da_state_alloc(args);
xfs_da3_fixhashpath(state, &state->path); state->inleaf = 0;
error = xfs_da3_node_lookup_int(state, &retval);
if (error)
goto out;
/* /*
* Check to see if the tree needs to be collapsed. * Remove the name and update the hashvals in the tree.
*/ */
if (retval && (state->path.active > 1)) { blk = &state->path.blk[state->path.active-1];
error = xfs_da3_join(state); ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
if (error) error = xfs_attr3_leaf_remove(blk->bp, args);
goto out; xfs_da3_fixhashpath(state, &state->path);
}
} else if (args->rmtblkno > 0) { /*
/* * Check to see if the tree needs to be collapsed.
* Added a "remote" value, just clear the incomplete flag. */
*/ if (retval && (state->path.active > 1)) {
error = xfs_attr3_leaf_clearflag(args); error = xfs_da3_join(state);
if (error) if (error)
goto out; goto out;
} }
......
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