aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 3da3c9646e5e..1fb390359bc5 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -5539,11 +5539,19 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
5539 ext4_truncate(inode); 5539 ext4_truncate(inode);
5540 } 5540 }
5541 5541
5542 rc = inode_setattr(inode, attr); 5542 if ((attr->ia_valid & ATTR_SIZE) &&
5543 attr->ia_size != i_size_read(inode))
5544 rc = vmtruncate(inode, attr->ia_size);
5543 5545
5544 /* If inode_setattr's call to ext4_truncate failed to get a 5546 if (!rc) {
5545 * transaction handle at all, we need to clean up the in-core 5547 setattr_copy(inode, attr);
5546 * orphan list manually. */ 5548 mark_inode_dirty(inode);
5549 }
5550
5551 /*
5552 * If the call to ext4_truncate failed to get a transaction handle at
5553 * all, we need to clean up the in-core orphan list manually.
5554 */
5547 if (inode->i_nlink) 5555 if (inode->i_nlink)
5548 ext4_orphan_del(NULL, inode); 5556 ext4_orphan_del(NULL, inode);
5549 5557