aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jbd/checkpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/jbd/checkpoint.c')
-rw-r--r--fs/jbd/checkpoint.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c
index 47552d4a6324..a5432bbbfb88 100644
--- a/fs/jbd/checkpoint.c
+++ b/fs/jbd/checkpoint.c
@@ -347,7 +347,8 @@ restart:
347 break; 347 break;
348 } 348 }
349 retry = __process_buffer(journal, jh, bhs,&batch_count); 349 retry = __process_buffer(journal, jh, bhs,&batch_count);
350 if (!retry && lock_need_resched(&journal->j_list_lock)){ 350 if (!retry && (need_resched() ||
351 spin_needbreak(&journal->j_list_lock))) {
351 spin_unlock(&journal->j_list_lock); 352 spin_unlock(&journal->j_list_lock);
352 retry = 1; 353 retry = 1;
353 break; 354 break;
@@ -602,15 +603,15 @@ int __journal_remove_checkpoint(struct journal_head *jh)
602 603
603 /* 604 /*
604 * There is one special case to worry about: if we have just pulled the 605 * There is one special case to worry about: if we have just pulled the
605 * buffer off a committing transaction's forget list, then even if the 606 * buffer off a running or committing transaction's checkpoing list,
606 * checkpoint list is empty, the transaction obviously cannot be 607 * then even if the checkpoint list is empty, the transaction obviously
607 * dropped! 608 * cannot be dropped!
608 * 609 *
609 * The locking here around j_committing_transaction is a bit sleazy. 610 * The locking here around t_state is a bit sleazy.
610 * See the comment at the end of journal_commit_transaction(). 611 * See the comment at the end of journal_commit_transaction().
611 */ 612 */
612 if (transaction == journal->j_committing_transaction) { 613 if (transaction->t_state != T_FINISHED) {
613 JBUFFER_TRACE(jh, "belongs to committing transaction"); 614 JBUFFER_TRACE(jh, "belongs to running/committing transaction");
614 goto out; 615 goto out;
615 } 616 }
616 617