summaryrefslogtreecommitdiffstats
path: root/fs/xfs/libxfs/xfs_defer.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/libxfs/xfs_defer.c')
-rw-r--r--fs/xfs/libxfs/xfs_defer.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
index cbee0a86c978..a5f7dc18a62f 100644
--- a/fs/xfs/libxfs/xfs_defer.c
+++ b/fs/xfs/libxfs/xfs_defer.c
@@ -341,7 +341,7 @@ xfs_defer_reset(
* If an inode is provided, relog it to the new transaction.
*/
int
-xfs_defer_finish(
+xfs_defer_finish_noroll(
struct xfs_trans **tp)
{
struct xfs_defer_ops *dop = (*tp)->t_dfops;
@@ -430,25 +430,37 @@ xfs_defer_finish(
cleanup_fn(*tp, state, error);
}
- /*
- * Roll the transaction once more to avoid returning to the caller
- * with a dirty transaction.
- */
- if ((*tp)->t_flags & XFS_TRANS_DIRTY) {
- error = xfs_defer_trans_roll(tp);
- dop = (*tp)->t_dfops;
- }
out:
- if (error) {
+ if (error)
trace_xfs_defer_finish_error((*tp)->t_mountp, dop, error);
- } else {
+ else
trace_xfs_defer_finish_done((*tp)->t_mountp, dop, _RET_IP_);
- xfs_defer_reset(dop);
- }
return error;
}
+int
+xfs_defer_finish(
+ struct xfs_trans **tp)
+{
+ int error;
+
+ /*
+ * Finish and roll the transaction once more to avoid returning to the
+ * caller with a dirty transaction.
+ */
+ error = xfs_defer_finish_noroll(tp);
+ if (error)
+ return error;
+ if ((*tp)->t_flags & XFS_TRANS_DIRTY) {
+ error = xfs_defer_trans_roll(tp);
+ if (error)
+ return error;
+ }
+ xfs_defer_reset((*tp)->t_dfops);
+ return 0;
+}
+
/*
* Free up any items left in the list.
*/