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: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:

committed by
Darrick J. Wong

parent
60f31a609e
commit
9b1f4e9831
@@ -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.
|
||||
|
Reference in New Issue
Block a user