Skip to content

Commit

Permalink
ext4: fix mmap data corruption in nodelalloc mode when blocksize < pa…
Browse files Browse the repository at this point in the history
…gesize

Since commit 90a8020 and d6320cb, Jan Kara has fixed this issue partially.
This mmap data corruption still exists in nodelalloc mode, fix this.

Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by:   Jan Kara <jack@suse.cz>
  • Loading branch information
Xiaoguang Wang authored and Theodore Ts'o committed Feb 13, 2015
1 parent 2cb5cc8 commit 0572639
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions fs/ext4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,6 +1007,7 @@ static int ext4_write_end(struct file *file,
{
handle_t *handle = ext4_journal_current_handle();
struct inode *inode = mapping->host;
loff_t old_size = inode->i_size;
int ret = 0, ret2;
int i_size_changed = 0;

Expand Down Expand Up @@ -1037,6 +1038,8 @@ static int ext4_write_end(struct file *file,
unlock_page(page);
page_cache_release(page);

if (old_size < pos)
pagecache_isize_extended(inode, old_size, pos);
/*
* Don't mark the inode dirty under page lock. First, it unnecessarily
* makes the holding time of page lock longer. Second, it forces lock
Expand Down Expand Up @@ -1078,6 +1081,7 @@ static int ext4_journalled_write_end(struct file *file,
{
handle_t *handle = ext4_journal_current_handle();
struct inode *inode = mapping->host;
loff_t old_size = inode->i_size;
int ret = 0, ret2;
int partial = 0;
unsigned from, to;
Expand Down Expand Up @@ -1110,6 +1114,9 @@ static int ext4_journalled_write_end(struct file *file,
unlock_page(page);
page_cache_release(page);

if (old_size < pos)
pagecache_isize_extended(inode, old_size, pos);

if (size_changed) {
ret2 = ext4_mark_inode_dirty(handle, inode);
if (!ret)
Expand Down

0 comments on commit 0572639

Please sign in to comment.