diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e106a9317b42979f150676b49fd0fc906de92d24..de6959cc2796eeb2e69c0de394636a6758cb7445 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5619,6 +5619,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) if (attr->ia_valid & ATTR_SIZE) { handle_t *handle; + loff_t old_disksize; loff_t oldsize = inode->i_size; int shrink = (attr->ia_size <= inode->i_size); @@ -5660,6 +5661,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) inode->i_ctime = inode->i_mtime; } down_write(&EXT4_I(inode)->i_data_sem); + old_disksize = EXT4_I(inode)->i_disksize; EXT4_I(inode)->i_disksize = attr->ia_size; rc = ext4_mark_inode_dirty(handle, inode); if (!error) @@ -5671,6 +5673,8 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) */ if (!error) i_size_write(inode, attr->ia_size); + else + EXT4_I(inode)->i_disksize = old_disksize; up_write(&EXT4_I(inode)->i_data_sem); ext4_journal_stop(handle); if (error) {