diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_defer.c')
-rw-r--r-- | fs/xfs/libxfs/xfs_defer.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c index 054a2032fdb3..c221d0ecd52e 100644 --- a/fs/xfs/libxfs/xfs_defer.c +++ b/fs/xfs/libxfs/xfs_defer.c | |||
@@ -194,7 +194,7 @@ xfs_defer_trans_abort( | |||
194 | /* Abort intent items. */ | 194 | /* Abort intent items. */ |
195 | list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { | 195 | list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { |
196 | trace_xfs_defer_pending_abort(tp->t_mountp, dfp); | 196 | trace_xfs_defer_pending_abort(tp->t_mountp, dfp); |
197 | if (dfp->dfp_committed) | 197 | if (!dfp->dfp_done) |
198 | dfp->dfp_type->abort_intent(dfp->dfp_intent); | 198 | dfp->dfp_type->abort_intent(dfp->dfp_intent); |
199 | } | 199 | } |
200 | 200 | ||
@@ -290,7 +290,6 @@ xfs_defer_finish( | |||
290 | struct xfs_defer_pending *dfp; | 290 | struct xfs_defer_pending *dfp; |
291 | struct list_head *li; | 291 | struct list_head *li; |
292 | struct list_head *n; | 292 | struct list_head *n; |
293 | void *done_item = NULL; | ||
294 | void *state; | 293 | void *state; |
295 | int error = 0; | 294 | int error = 0; |
296 | void (*cleanup_fn)(struct xfs_trans *, void *, int); | 295 | void (*cleanup_fn)(struct xfs_trans *, void *, int); |
@@ -309,19 +308,11 @@ xfs_defer_finish( | |||
309 | if (error) | 308 | if (error) |
310 | goto out; | 309 | goto out; |
311 | 310 | ||
312 | /* Mark all pending intents as committed. */ | ||
313 | list_for_each_entry_reverse(dfp, &dop->dop_pending, dfp_list) { | ||
314 | if (dfp->dfp_committed) | ||
315 | break; | ||
316 | trace_xfs_defer_pending_commit((*tp)->t_mountp, dfp); | ||
317 | dfp->dfp_committed = true; | ||
318 | } | ||
319 | |||
320 | /* Log an intent-done item for the first pending item. */ | 311 | /* Log an intent-done item for the first pending item. */ |
321 | dfp = list_first_entry(&dop->dop_pending, | 312 | dfp = list_first_entry(&dop->dop_pending, |
322 | struct xfs_defer_pending, dfp_list); | 313 | struct xfs_defer_pending, dfp_list); |
323 | trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); | 314 | trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); |
324 | done_item = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, | 315 | dfp->dfp_done = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, |
325 | dfp->dfp_count); | 316 | dfp->dfp_count); |
326 | cleanup_fn = dfp->dfp_type->finish_cleanup; | 317 | cleanup_fn = dfp->dfp_type->finish_cleanup; |
327 | 318 | ||
@@ -331,7 +322,7 @@ xfs_defer_finish( | |||
331 | list_del(li); | 322 | list_del(li); |
332 | dfp->dfp_count--; | 323 | dfp->dfp_count--; |
333 | error = dfp->dfp_type->finish_item(*tp, dop, li, | 324 | error = dfp->dfp_type->finish_item(*tp, dop, li, |
334 | done_item, &state); | 325 | dfp->dfp_done, &state); |
335 | if (error) { | 326 | if (error) { |
336 | /* | 327 | /* |
337 | * Clean up after ourselves and jump out. | 328 | * Clean up after ourselves and jump out. |
@@ -428,8 +419,8 @@ xfs_defer_add( | |||
428 | dfp = kmem_alloc(sizeof(struct xfs_defer_pending), | 419 | dfp = kmem_alloc(sizeof(struct xfs_defer_pending), |
429 | KM_SLEEP | KM_NOFS); | 420 | KM_SLEEP | KM_NOFS); |
430 | dfp->dfp_type = defer_op_types[type]; | 421 | dfp->dfp_type = defer_op_types[type]; |
431 | dfp->dfp_committed = false; | ||
432 | dfp->dfp_intent = NULL; | 422 | dfp->dfp_intent = NULL; |
423 | dfp->dfp_done = NULL; | ||
433 | dfp->dfp_count = 0; | 424 | dfp->dfp_count = 0; |
434 | INIT_LIST_HEAD(&dfp->dfp_work); | 425 | INIT_LIST_HEAD(&dfp->dfp_work); |
435 | list_add_tail(&dfp->dfp_list, &dop->dop_intake); | 426 | list_add_tail(&dfp->dfp_list, &dop->dop_intake); |