From: Mingming Cao <cmm@us.ibm.com>
To: Josef Bacik <jbacik@redhat.com>
Cc: Jan Kara <jack@suse.cz>,
linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] jbd: fix assertion failure in journal_next_log_block
Date: Wed, 06 Feb 2008 10:47:17 -0800 [thread overview]
Message-ID: <1202323637.4112.6.camel@localhost.localdomain> (raw)
In-Reply-To: <200802051359.05758.jbacik@redhat.com>
On Tue, 2008-02-05 at 13:59 -0500, Josef Bacik wrote:
> On Tuesday 05 February 2008 12:27:31 pm Jan Kara wrote:
> > Hello,
> >
> > Sorry for replying a bit late but I'm currently falling behind in
> > maling-list reading...
> >
> > > The way jbd tries to determine if there is enough space left on the
> > > journal in order to start a new transaction is looking at the space left
> > > in the journal and the space needed for the committing transaction, which
> > > is 1/4 of the journal + the number of t_outstanding_credits for that
> > > transaction. In this case its assumed that t_outstanding_credits
> > > accurately represents the number of credits
> >
> > Yes.
> >
> > > waiting to be written to the journal, but this sometimes isn't the case.
> > > The transaction has two counters for buffers, t_outstanding_credits which
> > > is used in conjunction with handles that are added to the transaction,
> > > and t_nr_buffers which is only incremented/decremented when buffers are
> > > added/removed from the transaction and are actually destined to be
> > > journaled. Normally these two
> >
> > t_nr_buffers actually represents number of buffers on BJ_Metadata list
> > and nobody uses it (except for the assertion in
> > __journal_temp_unlink_buffer()). t_outstanding_credits is supposed to be
> > *the* counter making sure we don't write more than we have credits for.
> >
> > > counters are the same, however there are cases where the committing
> > > transaction can have buffers moved to the next running transaction, for
> > > example any buffers on the committing transactions t_reserved list would
> > > be moved to the next (running) transaction, and if it had been dirtied in
> > > the process it would immediately make it onto the t_updates list, which
> > > would increment t_nr_buffers
> >
> > You probably mean t_buffers list here...
> >
> > > but not t_outstanding_credits. So you get into this situation where
> >
> > But which moving and dirtying do you mean? The caller which dirties
> > the buffer must make sure that he has acquired enough credits for the
> > transaction where the buffer ends up... So if there were not enough
> > buffers in the running transaction where we refiled the buffer it is a
> > bug in the caller which dirties the buffer.
> >
>
> You know now that you say that I feel like an idiot, you are right the only way
> for something to actually end up on that list was if somebody dirtied it and if
> they did it would have had to been accounted for at some point on the running
> transaction.
>
> > > t_nr_buffers (the actual number of buffers that are on the transaction)
> > > is greater than the number of buffers accounted for via
> > > t_outstanding_credits. This presents a problem since as we loop through
> > > writting buffers to the journal, we decrement t_outstanding_credits, and
> > > if t_nr_buffers is more than t_outstanding_credits then we end up with a
> > > negative number for
> > > t_outstanding_credits, which means we start saying we need less than 1/4
> > > of the journal for our committing transaction and allow more transactions
> > > than we can handle to start, and then bam we fail because
> > > journal_next_log_block doesn't have enough free blocks in order to handle
> > > the request. This has been tested and fixes the issue (which could not
> > > be reproduced by me but several other people could get it to reproduce
> > > using postmark), and although I couldn't reproduce the assertion, I could
> > > very easily reproduce the situation where t_outstanding_credits was <
> > > than t_nr_buffers.
> >
> > I suppose you see the assertion J_ASSERT(journal->j_free > 1); to
> > fail, right? I don't see how your patch could help avoid that assertion.
> > You've just removed accounting of t_outstanding_credits which has no
> > impact on the real number of free blocks in the journal stored in
> > j_free. Anyway, if you can reproduce t_outstanding_credits <
> > t_nr_buffers, then there's something fishy. Are you able to reproduce it
> > also with a current kernel?
> > Thanks for looking into the problem :)
> >
>
> Well my patch helped avoid the assertion because t_outstanding_credits was going
> negative therefore we were letting transactions start when we shouldn't be, and
> eventually we would end up with too much of the journal in use and we'd assert.
> Course I can't reproduce where t_outstanding_credits < t_nr_buffers upstream
> (again I feel like an idiot, should have tested that first). Thanks for
> looking at this Jan.
>
> Mingming, would you mind pulling this patch out of the patch queue please since
> its wrong? Thanks much,
>
Sure, done!
Mingming
prev parent reply other threads:[~2008-02-06 18:47 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-31 16:14 [PATCH] jbd: fix assertion failure in journal_next_log_block Josef Bacik
2008-01-31 19:35 ` Andreas Dilger
2008-01-31 21:52 ` Josef Bacik
2008-02-01 0:50 ` Mingming Cao
2008-02-05 17:27 ` Jan Kara
2008-02-05 18:59 ` Josef Bacik
2008-02-06 11:06 ` Jan Kara
2008-02-06 18:47 ` Mingming Cao [this message]
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=1202323637.4112.6.camel@localhost.localdomain \
--to=cmm@us.ibm.com \
--cc=jack@suse.cz \
--cc=jbacik@redhat.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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