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: Allison Collins <allison.henderson@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Acked-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
Родитель
5fdca0ad5c
Коммит
bf4a5cfffe
|
@ -1025,79 +1025,75 @@ restart:
|
||||||
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
|
|
||||||
* a "remote" value (if it exists).
|
|
||||||
*/
|
|
||||||
xfs_attr_restore_rmt_blk(args);
|
|
||||||
|
|
||||||
if (args->rmtblkno) {
|
|
||||||
error = xfs_attr_rmtval_invalidate(args);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
error = xfs_attr_rmtval_remove(args);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
args->attr_filter |= XFS_ATTR_INCOMPLETE;
|
|
||||||
state = xfs_da_state_alloc(args);
|
|
||||||
|
|
||||||
state->inleaf = 0;
|
|
||||||
error = xfs_da3_node_lookup_int(state, &retval);
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove the name and update the hashvals in the tree.
|
|
||||||
*/
|
|
||||||
blk = &state->path.blk[ state->path.active-1 ];
|
|
||||||
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
|
||||||
error = xfs_attr3_leaf_remove(blk->bp, args);
|
|
||||||
xfs_da3_fixhashpath(state, &state->path);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to see if the tree needs to be collapsed.
|
|
||||||
*/
|
|
||||||
if (retval && (state->path.active > 1)) {
|
|
||||||
error = xfs_da3_join(state);
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (args->rmtblkno > 0) {
|
|
||||||
/*
|
/*
|
||||||
* Added a "remote" value, just clear the incomplete flag.
|
* Added a "remote" value, just clear the incomplete flag.
|
||||||
*/
|
*/
|
||||||
error = xfs_attr3_leaf_clearflag(args);
|
if (args->rmtblkno > 0)
|
||||||
|
error = xfs_attr3_leaf_clearflag(args);
|
||||||
|
retval = error;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* 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 a "remote" value
|
||||||
|
* (if it exists).
|
||||||
|
*/
|
||||||
|
xfs_attr_restore_rmt_blk(args);
|
||||||
|
|
||||||
|
if (args->rmtblkno) {
|
||||||
|
error = xfs_attr_rmtval_invalidate(args);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
error = xfs_attr_rmtval_remove(args);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
args->attr_filter |= XFS_ATTR_INCOMPLETE;
|
||||||
|
state = xfs_da_state_alloc(args);
|
||||||
|
state->inleaf = 0;
|
||||||
|
error = xfs_da3_node_lookup_int(state, &retval);
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove the name and update the hashvals in the tree.
|
||||||
|
*/
|
||||||
|
blk = &state->path.blk[state->path.active-1];
|
||||||
|
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
||||||
|
error = xfs_attr3_leaf_remove(blk->bp, args);
|
||||||
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check to see if the tree needs to be collapsed.
|
||||||
|
*/
|
||||||
|
if (retval && (state->path.active > 1)) {
|
||||||
|
error = xfs_da3_join(state);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче