linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Zheng Liu <gnehzuil.liu@gmail.com>
Cc: Jan Kara <jack@suse.cz>, Ted Tso <tytso@mit.edu>,
	linux-ext4@vger.kernel.org
Subject: Re: Possible bug with extent status tree
Date: Tue, 12 Mar 2013 10:32:11 +0100	[thread overview]
Message-ID: <20130312093211.GA13152@quack.suse.cz> (raw)
In-Reply-To: <20130312035319.GB6142@gmail.com>

  Hello,

On Tue 12-03-13 11:53:19, Zheng Liu wrote:
> On Mon, Mar 11, 2013 at 09:38:34PM +0100, Jan Kara wrote:
> >   Hello,
> > 
> >   while looking into the ext4 code I spotted one thing which I think is a
> > bug introduced by extent status tree code. The problem is that
> > ext4_map_blocks() checks extent status tree and if the extent is found, it
> > doesn't call into ext4_ext_map_blocks(). However ext4_ext_direct_IO() expects
> > that if the extent DIO is done to is unwritten, EXT4_IO_END_UNWRITTEN flag
> > gets set in the io_end (or inode) flags and that happens only in
> > ext4_ext_map_blocks().
> > 
> > The easiest fix seems to be to move setting of flags from
> > ext4_ext_map_blocks() up into ext4_map_blocks() (or maybe even
> > _ext4_get_block()). What do you think?
> 
> Hi Jan,
> 
> Thanks for reviewing the code.  But I don't think it is a potential bug.
> Let's see what happens after adding extent status tree.  There are three
> cases that we need to take care, a) no block has been allocated, b)
> unwritten extent has been allocated, and c) written extent has been
> allocated.
> 
> a) no block has been allocated.
> In this case, both extent tree on disk and status tree in memory haven't
> this extent.  When we do a extent-based dio write, ext4_get_block_write
> will be called with EXT4_GET_BLOCKS_IO_CREATE_EXT flag.  In
> ext4_map_blocks(), the codepath looks like:
> 
> ext4_map_blocks()
>   ->ext4_es_lookup_extent()
>     [no extent found in status tree]
>   ->ext4_ext_map_blocks() without flags
>     [no extent found in extent tree]
>   ->ext4_ext_map_blocks() with EXT4_GET_BLOCKS_IO_CREATE_EXT
>     ->ext4_mb_new_blocks()
>       [allocate an unwritten extent]
>     ->ext4_set_io_unwritten_flag()
>       [set EXT4_IO_END_UNWRITTEN flag because _PRE_IO flag is set and an
>        unwritten extent has been allocated]
> 
> In this case, we are safe.
  Agreed.

> b) unwritten extent has been allocated
> In this case, both extent tree on disk and status tree in memory have an
> unwritten extent, and codepath looks like:
> 
> ext4_map_blocks()
>   ->ext4_es_lookup_extent()
>     [unwritten extent found in status tree, EXT4_MAP_UNWRITTEN flag is
>      marked in map->m_flags.  In the mean time, ext4_ext_map_blocks()
>      isn't called]
>   [But we don't return from ext4_map_blocks because EXT4_GET_BLOCKS_CREATE
>    flag is set and EXT4_MAP_MAPPED flag is not set]
>   ->ext4_ext_map_blocks() with EXT4_GET_BLOCKS_IO_CREATE_EXT
>     ->ext4_ext_handle_uninitialized_extents()
>       ->ext4_set_io_unwritten_flag()
>         [set EXT4_IO_END_UNWRITTEN flag because _PRE_IO flag is set]
> 
> So it seems that there is no bug.
  Ah, right. This is what I was missing. I didn't realize that we won't
set EXT4_MAP_MAPPED when the extent is unwritten so we will end up calling
ext4_ext_map_blocks() later. Sorry for the noise.

								Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

      reply	other threads:[~2013-03-12  9:32 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-11 20:38 Possible bug with extent status tree Jan Kara
2013-03-12  3:53 ` Zheng Liu
2013-03-12  9:32   ` Jan Kara [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=20130312093211.GA13152@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=gnehzuil.liu@gmail.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /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;
as well as URLs for NNTP newsgroup(s).