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:
Allison Collins 2020-07-20 21:47:31 -07:00 коммит произвёл Darrick J. Wong
Родитель 5fdca0ad5c
Коммит bf4a5cfffe
1 изменённых файлов: 66 добавлений и 70 удалений

Просмотреть файл

@ -1025,31 +1025,38 @@ restart:
return error; return error;
} }
if (!(args->op_flags & XFS_DA_OP_RENAME)) {
/* /*
* If this is an atomic rename operation, we must "flip" the * Added a "remote" value, just clear the incomplete flag.
* 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) { if (args->rmtblkno > 0)
error = xfs_attr3_leaf_clearflag(args);
retval = error;
goto out;
}
/* /*
* In a separate transaction, set the incomplete flag on the * If this is an atomic rename operation, we must "flip" the incomplete
* "old" attr and clear the incomplete flag on the "new" attr. * 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); error = xfs_attr3_leaf_flipflags(args);
if (error) if (error)
goto out; goto out;
/* /*
* Commit the flag value change and start the next trans in * Commit the flag value change and start the next trans in series
* series
*/ */
error = xfs_trans_roll_inode(&args->trans, args->dp); error = xfs_trans_roll_inode(&args->trans, args->dp);
if (error) if (error)
goto out; goto out;
/* /*
* Dismantle the "old" attribute/value pair by removing * Dismantle the "old" attribute/value pair by removing a "remote" value
* a "remote" value (if it exists). * (if it exists).
*/ */
xfs_attr_restore_rmt_blk(args); xfs_attr_restore_rmt_blk(args);
@ -1064,13 +1071,11 @@ restart:
} }
/* /*
* Re-find the "old" attribute entry after any split ops. * Re-find the "old" attribute entry after any split ops. The INCOMPLETE
* The INCOMPLETE flag means that we will find the "old" * flag means that we will find the "old" attr, not the "new" one.
* attr, not the "new" one.
*/ */
args->attr_filter |= XFS_ATTR_INCOMPLETE; args->attr_filter |= XFS_ATTR_INCOMPLETE;
state = xfs_da_state_alloc(args); state = xfs_da_state_alloc(args);
state->inleaf = 0; state->inleaf = 0;
error = xfs_da3_node_lookup_int(state, &retval); error = xfs_da3_node_lookup_int(state, &retval);
if (error) if (error)
@ -1092,15 +1097,6 @@ restart:
if (error) if (error)
goto out; goto out;
} }
} else if (args->rmtblkno > 0) {
/*
* Added a "remote" value, just clear the incomplete flag.
*/
error = xfs_attr3_leaf_clearflag(args);
if (error)
goto out;
}
retval = error = 0; retval = error = 0;
out: out: