Re: Possible race between direct IO and JBD?

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Mingming Cao
Date: Monday, April 28, 2008 - 12:09 pm

On Mon, 2008-04-28 at 20:09 +0200, Jan Kara wrote: 

Thanks, yes I noticed that after you pointing this out.

But __journal_try_to_free_buffer() only unfile the buffer from
t_sync_datalist or t_locked list, the journal head is not removed in
journal_remove_journal_head() there, at that time,
journal_remove_journal_head() just check if counter b_jcount is 0. But
before calling __journal_try_to_free_buffer(), since
journal_try_to_free_buffers() already increase the b_jcount in
journal_grab_journal_head(), so the journal head is not removed in
__journal_try_to_free_buffer-> journal_remove_journal_head()


Looking at the code, it seems the it's the journal_put_journal_head(jh)
who remove the journal head and decrease the bh

journal_try_to_free_buffers() 
{
...

jh = journal_grab_journal_head(bh);
                if (!jh)
                        continue;

                jbd_lock_bh_state(bh);
                __journal_try_to_free_buffer(journal, bh);
                journal_put_journal_head(jh);
                jbd_unlock_bh_state(bh);

...

}
 so when journal_put_journal_head()-> __journal_remove_journal_head(),
now the b_jcount is zero, but is  
jh->b_transaction is NULL? So it seems possible that bh ref count is non
zero when exit from journal_put_journal_head() if jh_b_transaction is
not cleared.

I miss where jh->b_transaction is clear to NULL? 

void journal_put_journal_head(struct journal_head *jh)
{
        struct buffer_head *bh = jh2bh(jh);

        jbd_lock_bh_journal_head(bh);
        J_ASSERT_JH(jh, jh->b_jcount > 0);
        --jh->b_jcount;
        if (!jh->b_jcount && !jh->b_transaction) {
                __journal_remove_journal_head(bh);
                __brelse(bh);
        }
        jbd_unlock_bh_journal_head(bh);
}


Mingming


--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC] JBD ordered mode rewrite, Jan Kara, (Thu Mar 6, 10:42 am)
Re: [RFC] JBD ordered mode rewrite, Josef Bacik, (Thu Mar 6, 12:05 pm)
Re: [RFC] JBD ordered mode rewrite, Andrew Morton, (Thu Mar 6, 4:53 pm)
Re: [RFC] JBD ordered mode rewrite, Mark Fasheh, (Thu Mar 6, 6:34 pm)
Re: [RFC] JBD ordered mode rewrite, Mingming Cao, (Fri Mar 7, 3:55 am)
Re: [RFC] JBD ordered mode rewrite, Andreas Dilger, (Fri Mar 7, 4:52 pm)
Re: [RFC] JBD ordered mode rewrite, Mingming Cao, (Fri Mar 7, 5:08 pm)
Re: [RFC] JBD ordered mode rewrite, Christoph Hellwig, (Sat Mar 8, 5:14 am)
Re: [RFC] JBD ordered mode rewrite, Jan Kara, (Mon Mar 10, 9:30 am)
Re: [RFC] JBD ordered mode rewrite, Jan Kara, (Mon Mar 10, 10:38 am)
Re: [RFC] JBD ordered mode rewrite, Jan Kara, (Mon Mar 10, 11:00 am)
Re: [RFC] JBD ordered mode rewrite, Jan Kara, (Mon Mar 10, 11:29 am)
Re: [RFC] JBD ordered mode rewrite, Jan Kara, (Mon Mar 10, 12:54 pm)
Re: [RFC] JBD ordered mode rewrite, Andreas Dilger, (Mon Mar 10, 2:37 pm)
Possible race between direct IO and JBD?, Mingming Cao, (Fri Apr 25, 4:38 pm)
Re: Possible race between direct IO and JBD?, Andrew Morton, (Sat Apr 26, 3:41 am)
Re: Possible race between direct IO and JBD?, Jan Kara, (Mon Apr 28, 5:26 am)
Re: Possible race between direct IO and JBD?, Badari Pulavarty, (Mon Apr 28, 10:11 am)
Re: Possible race between direct IO and JBD?, Jan Kara, (Mon Apr 28, 11:09 am)
Re: Possible race between direct IO and JBD?, Mingming Cao, (Mon Apr 28, 12:09 pm)
Re: Possible race between direct IO and JBD?, Jan Kara, (Tue Apr 29, 5:43 am)
Re: Possible race between direct IO and JBD?, Mingming Cao, (Tue Apr 29, 10:49 am)
Re: [PATCH] Fix DIO EIO error caused by race between jbd_c ..., Badari Pulavarty, (Fri May 16, 10:12 am)
Re: [PATCH] Fix DIO EIO error caused by race between jbd_c ..., Badari Pulavarty, (Fri May 16, 10:17 am)
Re: [PATCH][take 5] JBD2: Fix race between free buffer and ..., Aneesh Kumar K.V, (Thu May 29, 11:24 pm)