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

xfs: Simplify xfs_attr_leaf_addname

Invert the rename logic in xfs_attr_leaf_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 72b97ea4
...@@ -695,68 +695,71 @@ xfs_attr_leaf_addname( ...@@ -695,68 +695,71 @@ xfs_attr_leaf_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 * Added a "remote" value, just clear the incomplete flag.
* "old" attr and clear the incomplete flag on the "new" attr.
*/
error = xfs_attr3_leaf_flipflags(args);
if (error)
return error;
/*
* Commit the flag value change and start the next trans in
* series.
*/ */
error = xfs_trans_roll_inode(&args->trans, args->dp); if (args->rmtblkno > 0)
if (error) error = xfs_attr3_leaf_clearflag(args);
return error;
/* return error;
* 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 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_attr_rmtval_remove(args); error = xfs_attr3_leaf_flipflags(args);
if (error) if (error)
return error; return error;
} /*
* Commit the flag value change and start the next trans in series.
*/
error = xfs_trans_roll_inode(&args->trans, args->dp);
if (error)
return error;
/* /*
* Read in the block containing the "old" attr, then * Dismantle the "old" attribute/value pair by removing a "remote" value
* remove the "old" attr from that block (neat, huh!) * (if it exists).
*/ */
error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, xfs_attr_restore_rmt_blk(args);
&bp);
if (args->rmtblkno) {
error = xfs_attr_rmtval_invalidate(args);
if (error) if (error)
return error; return error;
xfs_attr3_leaf_remove(bp, args); error = xfs_attr_rmtval_remove(args);
if (error)
/* return error;
* If the result is small enough, shrink it all into the inode.
*/
forkoff = xfs_attr_shortform_allfit(bp, dp);
if (forkoff)
error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
/* bp is gone due to xfs_da_shrink_inode */
} else if (args->rmtblkno > 0) {
/*
* Added a "remote" value, just clear the incomplete flag.
*/
error = xfs_attr3_leaf_clearflag(args);
} }
/*
* Read in the block containing the "old" attr, then remove the "old"
* attr from that block (neat, huh!)
*/
error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno,
&bp);
if (error)
return error;
xfs_attr3_leaf_remove(bp, args);
/*
* If the result is small enough, shrink it all into the inode.
*/
forkoff = xfs_attr_shortform_allfit(bp, dp);
if (forkoff)
error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
/* bp is gone due to xfs_da_shrink_inode */
return error; return error;
} }
......
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