From: Peng Tao <bergwolf@gmail.com>
To: Akira Fujita <a-fujita@rs.jp.nec.com>
Cc: ext4 development <linux-ext4@vger.kernel.org>,
Kazuya Mio <k-mio@sx.jp.nec.com>, Theodore Ts'o <tytso@mit.edu>
Subject: Re: donor file data inconsistent after EXT4_IOC_MOVE_EXT
Date: Mon, 19 Oct 2009 13:42:37 +0800 [thread overview]
Message-ID: <4ADBFC4D.8050405@gmail.com> (raw)
In-Reply-To: <4ADBCEDE.3050009@gmail.com>
Hi, Akira,
Peng Tao wrote:
> Hi, Akira,
> Akira Fujita wrote:
>> Hi Peng,
>>
>> This is a known issue, and I sent a patch to linux-ext4 2 weeks ago.
>> Unfortunately it is not included in the ext4 patch queue yet.
>>
>> http://marc.info/?l=linux-ext4&m=125447192709338&w=2
>>
>> Would you retry your test case with above my patch?
> It didn't work. I still got the old donor file data.
invalidate_mapping_pages() in your patch won't invalidate the locked page returned by
grab_cache_page(). The following patch addresses the bug by calling
invalidate_inode_pages2_range() instead.
commit e88c6fa454c38039e9f342196129f8ef782f5edb
Author: Peng Tao <bergwolf@gmail.com>
Date: Mon Oct 19 10:57:51 2009 +0800
ext4: Invalidate donor file pagecache in EXT4_IOC_MOVE_EXT
After calling EXT4_IOC_MOVE_EXT, the donor file will have data blocks previously
owned by the orig file. But the pagecache for donor file still refers to old
blocks in memory. The patch invalidates all pagecaches for donor file corresponding
to replaced blocks. So later reading donor file won't hit the wrong pagecache.
Signed-off-by: Peng Tao <bergwolf@gmail.com>
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
index 25b6b14..dcdfec8 100644
--- a/fs/ext4/move_extent.c
+++ b/fs/ext4/move_extent.c
@@ -826,6 +826,7 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
const struct address_space_operations *a_ops = mapping->a_ops;
handle_t *handle;
ext4_lblk_t orig_blk_offset;
+ pgoff_t donor_page_offset = orig_page_offset;
long long offs = orig_page_offset << PAGE_CACHE_SHIFT;
unsigned long blocksize = orig_inode->i_sb->s_blocksize;
unsigned int w_flags = 0;
@@ -920,6 +921,8 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode,
ext4_ext_invalidate_cache(orig_inode);
ext4_ext_invalidate_cache(donor_inode);
+ invalidate_inode_pages2_range(donor_inode->i_mapping, donor_page_offset,
+ donor_page_offset);
if (!page_has_buffers(page))
create_empty_buffers(page, 1 << orig_inode->i_blkbits, 0);
next prev parent reply other threads:[~2009-10-19 5:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-18 7:03 donor file data inconsistent after EXT4_IOC_MOVE_EXT Peng Tao
2009-10-19 0:40 ` Akira Fujita
2009-10-19 2:28 ` Peng Tao
2009-10-19 5:42 ` Peng Tao [this message]
2009-10-19 8:28 ` Akira Fujita
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=4ADBFC4D.8050405@gmail.com \
--to=bergwolf@gmail.com \
--cc=a-fujita@rs.jp.nec.com \
--cc=k-mio@sx.jp.nec.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