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

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
Loading
Loading
Loading
Loading
+59 −63
Original line number Diff line number Diff line
@@ -1025,31 +1025,38 @@ restart:
			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.
		 * Added a "remote" value, just clear the incomplete flag.
		 */
	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
		 * "old" attr and clear the incomplete flag on the "new" attr.
	 * 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
	 * 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).
	 * Dismantle the "old" attribute/value pair by removing a "remote" value
	 * (if it exists).
	 */
	xfs_attr_restore_rmt_blk(args);

@@ -1064,13 +1071,11 @@ restart:
	}

	/*
		 * 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.
	 * 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)
@@ -1092,15 +1097,6 @@ restart:
		if (error)
			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;

out: