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

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
Loading
Loading
Loading
Loading
+55 −52
Original line number Diff line number Diff line
@@ -695,31 +695,39 @@ xfs_attr_leaf_addname(
			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);

		return error;
	}

	/*
		 * 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)
		return error;
	/*
		 * 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)
		return error;

	/*
		 * 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);

@@ -734,8 +742,8 @@ xfs_attr_leaf_addname(
	}

	/*
		 * Read in the block containing the "old" attr, then
		 * remove the "old" attr from that block (neat, huh!)
	 * 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);
@@ -751,12 +759,7 @@ xfs_attr_leaf_addname(
	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);
	}

	return error;
}