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: 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:
parent
72b97ea40d
commit
5fdca0ad5c
|
@ -695,68 +695,71 @@ xfs_attr_leaf_addname(
|
|||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
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;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
} else if (args->rmtblkno > 0) {
|
||||
if (!(args->op_flags & XFS_DA_OP_RENAME)) {
|
||||
/*
|
||||
* 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);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
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;
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue