diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 0a31197590d..4df5e95801b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4054,6 +4054,7 @@ static int ext4_do_update_inode(handle_t *handle,  	struct ext4_inode_info *ei = EXT4_I(inode);  	struct buffer_head *bh = iloc->bh;  	int err = 0, rc, block; +	int need_datasync = 0;  	uid_t i_uid;  	gid_t i_gid; @@ -4104,7 +4105,10 @@ static int ext4_do_update_inode(handle_t *handle,  		raw_inode->i_file_acl_high =  			cpu_to_le16(ei->i_file_acl >> 32);  	raw_inode->i_file_acl_lo = cpu_to_le32(ei->i_file_acl); -	ext4_isize_set(raw_inode, ei->i_disksize); +	if (ei->i_disksize != ext4_isize(raw_inode)) { +		ext4_isize_set(raw_inode, ei->i_disksize); +		need_datasync = 1; +	}  	if (ei->i_disksize > 0x7fffffffULL) {  		struct super_block *sb = inode->i_sb;  		if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, @@ -4157,7 +4161,7 @@ static int ext4_do_update_inode(handle_t *handle,  		err = rc;  	ext4_clear_inode_state(inode, EXT4_STATE_NEW); -	ext4_update_inode_fsync_trans(handle, inode, 0); +	ext4_update_inode_fsync_trans(handle, inode, need_datasync);  out_brelse:  	brelse(bh);  	ext4_std_error(inode->i_sb, err);  |