diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 16 |
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 | ||