| From: Eryu Guan <guaneryu@gmail.com> |
| Date: Tue, 28 Jul 2015 15:08:41 -0400 |
| Subject: ext4: update c/mtime on truncate up |
| |
| commit 911af577de4e444622d46500c1f9a37ab4335d3a upstream. |
| |
| Commit 3da40c7b0898 ("ext4: only call ext4_truncate when size <= isize") |
| introduced a bug that c/mtime is not updated on truncate up. |
| |
| Fix the issue by setting c/mtime explicitly in the truncate up case. |
| |
| Note that ftruncate(2) is not affected, so you won't see this bug using |
| truncate(1) and xfs_io(1). |
| |
| Signed-off-by: Zirong Lang <zorro.lang@gmail.com> |
| Signed-off-by: Eryu Guan <guaneryu@gmail.com> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/ext4/inode.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/fs/ext4/inode.c |
| +++ b/fs/ext4/inode.c |
| @@ -4843,6 +4843,14 @@ int ext4_setattr(struct dentry *dentry, |
| error = ext4_orphan_add(handle, inode); |
| orphan = 1; |
| } |
| + /* |
| + * Update c/mtime on truncate up, ext4_truncate() will |
| + * update c/mtime in shrink case below |
| + */ |
| + if (!shrink) { |
| + inode->i_mtime = ext4_current_time(inode); |
| + inode->i_ctime = inode->i_mtime; |
| + } |
| down_write(&EXT4_I(inode)->i_data_sem); |
| EXT4_I(inode)->i_disksize = attr->ia_size; |
| rc = ext4_mark_inode_dirty(handle, inode); |