From: "Duane Griffin" <duaneg@dghda.com>
To: "Andrew Morton" <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, sct@redhat.com,
linux-ext4@vger.kernel.org, "Sami Liedes" <sliedes@cc.hut.fi>
Subject: Re: [PATCH] jbd: abort instead of waiting for nonexistent transactions
Date: Tue, 5 Aug 2008 01:41:40 +0100 [thread overview]
Message-ID: <e9e943910808041741q4e95a96cu11dbe28cbf481c41@mail.gmail.com> (raw)
In-Reply-To: <20080804170346.613238b8.akpm@linux-foundation.org>
2008/8/5 Andrew Morton <akpm@linux-foundation.org>:
> On Tue, 5 Aug 2008 00:51:34 +0100 "Duane Griffin" <duaneg@dghda.com> wrote:
>
>> The __log_wait_for_space function sits in a loop checkpointing transactions
>> until there is sufficient space free in the journal. However, if there are
>> no transactions to be processed (e.g. because the free space calculation is
>> wrong due to a corrupted filesystem) it will never progress.
>>
>> Check for space being required when no transactions are outstanding and
>> abort the journal instead of endlessly looping.
>>
>> This patch fixes the bug reported by Sami Liedes at:
>> http://bugzilla.kernel.org/show_bug.cgi?id=10976
>>
>> Signed-off-by: Duane Griffin <duaneg@dghda.com>
>> Tested-by: Sami Liedes <sliedes@cc.hut.fi>
>> ---
>> diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c
>> index a5432bb..9fac177 100644
>> --- a/fs/jbd/checkpoint.c
>> +++ b/fs/jbd/checkpoint.c
>> @@ -126,14 +126,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);
>> }
>
> I don't expect that the additional taking of j_list_lock in here does
> anything useful.
>
> Plus.. after j_list_lock has been dropped, new transactions could
> theoretically appear at journal->j_checkpoint_transactions, so we
> _could_ reclaim more journal space. But a) that probably couldn't
> happen due to ->j_state_lock and lots of other things and b) it's
> hopelessly theoretical even if it _could_ happen, methinks. Just
> sayin'..
Fair enough. I was just trying to be extra careful in taking the lock,
so I'm happy to drop it if you think it is safe. It will simplify the
patch significantly.
Cheers,
Duane.
--
"I never could learn to drink that blood and call it wine" - Bob Dylan
next prev parent reply other threads:[~2008-08-05 0:41 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-04 23:51 [PATCH] jbd: abort instead of waiting for nonexistent transactions Duane Griffin
2008-08-04 23:51 ` [PATCH] jbd2: " Duane Griffin
2008-08-05 0:03 ` [PATCH] jbd: " Andrew Morton
2008-08-05 0:41 ` Duane Griffin [this message]
2008-08-05 15:50 ` Stephen C. Tweedie
2008-08-07 0:47 ` Duane Griffin
2008-08-07 15:01 ` Stephen C. Tweedie
-- strict thread matches above, loose matches on Subject: below --
2008-08-05 1:05 Duane Griffin
2008-08-05 1:42 ` Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e9e943910808041741q4e95a96cu11dbe28cbf481c41@mail.gmail.com \
--to=duaneg@dghda.com \
--cc=akpm@linux-foundation.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sct@redhat.com \
--cc=sliedes@cc.hut.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox