f2fs: correct i_size change for atomic writes

We need to make sure i_size doesn't change until atomic write commit is
successful and restore it when commit is failed.

Signed-off-by: Daeho Jeong <daehojeong@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Daeho Jeong
2022-10-31 12:24:15 -07:00
committed by Jaegeuk Kim
parent eb49548d79
commit ec8ef4fe47
4 changed files with 33 additions and 12 deletions

View File

@@ -191,14 +191,18 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean)
if (!f2fs_is_atomic_file(inode))
return;
if (clean)
truncate_inode_pages_final(inode->i_mapping);
clear_inode_flag(fi->cow_inode, FI_COW_FILE);
iput(fi->cow_inode);
fi->cow_inode = NULL;
release_atomic_write_cnt(inode);
clear_inode_flag(inode, FI_ATOMIC_COMMITTED);
clear_inode_flag(inode, FI_ATOMIC_FILE);
stat_dec_atomic_inode(inode);
if (clean) {
truncate_inode_pages_final(inode->i_mapping);
f2fs_i_size_write(inode, fi->original_i_size);
}
}
static int __replace_atomic_write_block(struct inode *inode, pgoff_t index,
@@ -334,10 +338,12 @@ next:
}
out:
if (ret)
if (ret) {
sbi->revoked_atomic_block += fi->atomic_write_cnt;
else
} else {
sbi->committed_atomic_block += fi->atomic_write_cnt;
set_inode_flag(inode, FI_ATOMIC_COMMITTED);
}
__complete_revoke_list(inode, &revoke_list, ret ? true : false);