Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b1f4e98 authored by Brian Foster's avatar Brian Foster Committed by Darrick J. Wong
Browse files

xfs: cancel dfops on xfs_defer_finish() error



The current semantics of xfs_defer_finish() require the caller to
call xfs_defer_cancel() on error. This is slightly inconsistent with
transaction commit error handling where a failed commit cleans up
the transaction before returning.

More significantly, the only requirement for exposure of
->dop_pending outside of xfs_defer_finish() is so that
xfs_defer_cancel() can drain it on error. Since the only recourse of
xfs_defer_finish() errors is cancellation, mirror the transaction
logic and cancel remaining dfops before returning from
xfs_defer_finish() with an error.

Beside simplifying xfs_defer_finish() semantics, this ensures that
xfs_defer_finish() always returns with an empty ->dop_pending and
thus facilitates removal of the list from xfs_defer_ops.

Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 60f31a60
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -590,7 +590,7 @@ xfs_attr_leaf_addname(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			return error;

		/*
		 * Commit the current trans (including the inode) and start
@@ -678,7 +678,7 @@ xfs_attr_leaf_addname(
				goto out_defer_cancel;
			error = xfs_defer_finish(&args->trans);
			if (error)
				goto out_defer_cancel;
				return error;
		}

		/*
@@ -741,7 +741,7 @@ xfs_attr_leaf_removename(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			return error;
	}
	return 0;
out_defer_cancel:
@@ -867,7 +867,7 @@ xfs_attr_node_addname(
				goto out_defer_cancel;
			error = xfs_defer_finish(&args->trans);
			if (error)
				goto out_defer_cancel;
				goto out;

			/*
			 * Commit the node conversion and start the next
@@ -891,7 +891,7 @@ xfs_attr_node_addname(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			goto out;
	} else {
		/*
		 * Addition succeeded, update Btree hashvals.
@@ -987,7 +987,7 @@ xfs_attr_node_addname(
				goto out_defer_cancel;
			error = xfs_defer_finish(&args->trans);
			if (error)
				goto out_defer_cancel;
				goto out;
		}

		/*
@@ -1110,7 +1110,7 @@ xfs_attr_node_removename(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			goto out;
		/*
		 * Commit the Btree join operation and start a new trans.
		 */
@@ -1141,7 +1141,7 @@ xfs_attr_node_removename(
				goto out_defer_cancel;
			error = xfs_defer_finish(&args->trans);
			if (error)
				goto out_defer_cancel;
				goto out;
		} else
			xfs_trans_brelse(args->trans, bp);
	}
+2 −2
Original line number Diff line number Diff line
@@ -488,7 +488,7 @@ xfs_attr_rmtval_set(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			return error;

		ASSERT(nmap == 1);
		ASSERT((map.br_startblock != DELAYSTARTBLOCK) &&
@@ -628,7 +628,7 @@ xfs_attr_rmtval_remove(
			goto out_defer_cancel;
		error = xfs_defer_finish(&args->trans);
		if (error)
			goto out_defer_cancel;
			return error;

		/*
		 * Close out trans and start the next one in the chain.
+6 −5
Original line number Diff line number Diff line
@@ -416,16 +416,17 @@ xfs_defer_finish_noroll(
	}

out:
	if (error)
	if (error) {
		trace_xfs_defer_finish_error((*tp)->t_mountp, (*tp)->t_dfops,
					     error);
	 else
		trace_xfs_defer_finish_done((*tp)->t_mountp, (*tp)->t_dfops,
					    _RET_IP_);

		xfs_defer_cancel(*tp);
		return error;
	}

	trace_xfs_defer_finish_done((*tp)->t_mountp, (*tp)->t_dfops, _RET_IP_);
	return 0;
}

int
xfs_defer_finish(
	struct xfs_trans	**tp)
+1 −1
Original line number Diff line number Diff line
@@ -1624,7 +1624,7 @@ xfs_swap_extent_rmap(
			error = xfs_defer_finish(tpp);
			tp = *tpp;
			if (error)
				goto out_defer;
				goto out;

			tirec.br_startoff += rlen;
			if (tirec.br_startblock != HOLESTARTBLOCK &&
+1 −1
Original line number Diff line number Diff line
@@ -371,7 +371,7 @@ xfs_dquot_disk_alloc(
	tp = *tpp;
	if (error) {
		xfs_buf_relse(bp);
		goto error1;
		goto error0;
	}
	*bpp = bp;
	return 0;
Loading