From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: Theodore Tso <tytso@mit.edu>
Cc: Kevin Shanahan <kmshanah@ucwb.org.au>,
Andreas Dilger <adilger@sun.com>, Alex Tomas <bzzz@sun.com>,
linux-ext4@vger.kernel.org
Subject: Re: More ext4 acl/xattr corruption - 4th occurence now
Date: Fri, 15 May 2009 10:25:08 +0530 [thread overview]
Message-ID: <20090515045508.GA1279@skywalker> (raw)
In-Reply-To: <20090514212325.GG21316@mit.edu>
On Thu, May 14, 2009 at 05:23:25PM -0400, Theodore Tso wrote:
> On Fri, May 15, 2009 at 06:32:45AM +0930, Kevin Shanahan wrote:
> > Okay, so now I've booted into 2.6.29.3 + check_block_validity patch +
> > short circuit i_cached_extent patch, mounted the fs without
> > nodelalloc. I was able to run the full exchange backup without
> > triggering the check_block_validity error.
>
> Great!
>
> So here's the final fix (it replaces the short circuit i_cached_extent
> patch) which I plan to push to Linus. It should be much less of a
> performance hit than simply short-circuiting i_cached_extent...
>
> Thanks so much for helping to find track this down!!! If ever someone
> deserved an "Ext4 Baker Street Irregulars" T-shirt, it would be
> you....
>
> - Ted
>
> commit 039ed7a483fdcb2dbbc29f00cd0d74c101ab14c5
> Author: Theodore Ts'o <tytso@mit.edu>
> Date: Thu May 14 17:09:37 2009 -0400
>
> ext4: Fix race in ext4_inode_info.i_cached_extent
>
> If one CPU is reading from a file while another CPU is writing to the
> same file different locations, there is nothing protecting the
> i_cached_extent structure from being used and updated at the same
> time. This could potentially cause the wrong location on disk to be
> read or written to, including potentially causing the corruption of
> the block group descriptors and/or inode table.
It should be multiple readers. We don't allow read/write or multiple
writers via ext4_ext_get_blocks. &EXT4_I(inode)->i_data_sem is supposed
to protect read/write and multiple writers. What it allowed was
multiple readers(get_block call with create = 0). And readers did cache
the extent information which it read from the disk. So the fix is
correct, but we need to update the commit message.
Reviewed-by:Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
>
> Many thanks to Ken Shannah for helping to track down this problem.
>
> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
>
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index 172656c..e3a55eb 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -1841,11 +1841,13 @@ ext4_ext_put_in_cache(struct inode *inode, ext4_lblk_t block,
> {
> struct ext4_ext_cache *cex;
> BUG_ON(len == 0);
> + spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
> cex = &EXT4_I(inode)->i_cached_extent;
> cex->ec_type = type;
> cex->ec_block = block;
> cex->ec_len = len;
> cex->ec_start = start;
> + spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
> }
>
> /*
> @@ -1902,12 +1904,17 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
> struct ext4_extent *ex)
> {
> struct ext4_ext_cache *cex;
> + int ret = EXT4_EXT_CACHE_NO;
>
> + /*
> + * We borrow i_block_reservation_lock to protect i_cached_extent
> + */
> + spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
> cex = &EXT4_I(inode)->i_cached_extent;
>
> /* has cache valid data? */
> if (cex->ec_type == EXT4_EXT_CACHE_NO)
> - return EXT4_EXT_CACHE_NO;
> + goto errout;
>
> BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
> cex->ec_type != EXT4_EXT_CACHE_EXTENT);
> @@ -1918,11 +1925,11 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
> ext_debug("%u cached by %u:%u:%llu\n",
> block,
> cex->ec_block, cex->ec_len, cex->ec_start);
> - return cex->ec_type;
> + ret = cex->ec_type;
> }
> -
> - /* not in cache */
> - return EXT4_EXT_CACHE_NO;
> +errout:
> + spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
> + return ret;
> }
>
> /*
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2009-05-15 4:55 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-13 6:26 More ext4 acl/xattr corruption - 4th occurence now Kevin Shanahan
2009-05-13 23:56 ` Kevin Shanahan
2009-05-14 4:40 ` Theodore Tso
2009-05-14 11:07 ` Kevin Shanahan
2009-05-14 11:17 ` Manish Katiyar
2009-05-14 12:30 ` Theodore Tso
2009-05-14 13:25 ` Kevin Shanahan
2009-05-14 14:07 ` Theodore Tso
2009-05-14 14:30 ` Kevin Shanahan
2009-05-14 15:44 ` Eric Sandeen
2009-05-14 21:07 ` Kevin Shanahan
2009-05-14 21:08 ` Eric Sandeen
2009-05-14 16:12 ` Theodore Tso
2009-05-14 21:02 ` Kevin Shanahan
2009-05-14 21:23 ` Theodore Tso
2009-05-14 21:33 ` Kevin Shanahan
2009-05-15 23:18 ` Kevin Shanahan
2009-05-15 1:21 ` Eric Sandeen
2009-05-15 12:50 ` Theodore Tso
2009-05-15 12:58 ` Eric Sandeen
2009-05-15 15:24 ` Eric Sandeen
2009-05-15 16:27 ` Eric Sandeen
2009-05-15 4:55 ` Aneesh Kumar K.V [this message]
2009-05-15 10:11 ` Theodore Tso
2009-05-15 13:07 ` Theodore Tso
2009-05-19 10:00 ` Thierry Vignaud
2009-05-19 11:36 ` Theodore Tso
2009-05-19 12:01 ` Alex Tomas
2009-05-19 15:04 ` Theodore Tso
2009-05-19 15:16 ` Alex Tomas
2009-05-19 15:18 ` Thierry Vignaud
2009-05-15 3:57 ` Alex Tomas
2009-05-15 4:58 ` Aneesh Kumar K.V
2009-05-15 10:27 ` Theodore Tso
2009-05-18 2:14 ` [PATCH] ext4: Add a comprehensive block validity check to ext4_get_blocks() (Was: More ext4 acl/xattr corruption - 4th occurence now) Theodore Tso
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=20090515045508.GA1279@skywalker \
--to=aneesh.kumar@linux.vnet.ibm.com \
--cc=adilger@sun.com \
--cc=bzzz@sun.com \
--cc=kmshanah@ucwb.org.au \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.