From c5cb68cbc0d59c8d8df61a4df25abfc770246de5 Mon Sep 17 00:00:00 2001 From: Duane Griffin Date: Wed, 22 Oct 2008 14:15:03 -0700 Subject: [PATCH] --- yaml --- r: 116975 b: refs/heads/master c: be07c4ed4043ab8c26f222348136141335e47a2f h: refs/heads/master i: 116973: cf2caf14c71329877e2a5b27e22ef2466f266996 116971: f63d95995273a3b70abcfca41c387976383a3ddc 116967: 4b0fb7d80aa4800bcae6b07705fcb31a4fa48914 116959: c71ae24c50f7ff464db5f8be02d57d40720c1197 v: v3 --- [refs] | 2 +- trunk/fs/jbd/checkpoint.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 357b7dfe09aa..0f7939515ceb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9f818b4ac04f53458d0354950b4f229f54be4dbf +refs/heads/master: be07c4ed4043ab8c26f222348136141335e47a2f diff --git a/trunk/fs/jbd/checkpoint.c b/trunk/fs/jbd/checkpoint.c index fe8521933243..1bd8d4acc6f2 100644 --- a/trunk/fs/jbd/checkpoint.c +++ b/trunk/fs/jbd/checkpoint.c @@ -127,14 +127,29 @@ void __log_wait_for_space(journal_t *journal) /* * Test again, another process may have checkpointed while we - * were waiting for the checkpoint lock + * were waiting for the checkpoint lock. If there are no + * outstanding transactions there is nothing to checkpoint and + * we can't make progress. Abort the journal in this case. */ spin_lock(&journal->j_state_lock); + spin_lock(&journal->j_list_lock); nblocks = jbd_space_needed(journal); if (__log_space_left(journal) < nblocks) { + int chkpt = journal->j_checkpoint_transactions != NULL; + + spin_unlock(&journal->j_list_lock); spin_unlock(&journal->j_state_lock); - log_do_checkpoint(journal); + if (chkpt) { + log_do_checkpoint(journal); + } else { + printk(KERN_ERR "%s: no transactions\n", + __func__); + journal_abort(journal, 0); + } + spin_lock(&journal->j_state_lock); + } else { + spin_unlock(&journal->j_list_lock); } mutex_unlock(&journal->j_checkpoint_mutex); }