aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/file.c
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-08-09 14:46:15 +0900
committerAndreas Blaesius <skate4life@gmx.de>2016-06-05 21:20:35 +0200
commitaa7b322a2a1ce0c2bcd5960adedf564b9c386192 (patch)
tree26f3ba418533f8dfba3fe3ff1983f7ac7f1337d8 /fs/f2fs/file.c
parentf62ad0436f98453b2ac34f03ac4cb49d1c2e8ee1 (diff)
downloadkernel_samsung_espresso10-aa7b322a2a1ce0c2bcd5960adedf564b9c386192.zip
kernel_samsung_espresso10-aa7b322a2a1ce0c2bcd5960adedf564b9c386192.tar.gz
kernel_samsung_espresso10-aa7b322a2a1ce0c2bcd5960adedf564b9c386192.tar.bz2
f2fs: fix inconsistency between xattr node blocks and its inode
Previously xattr node blocks are stored to the COLD_NODE log, which means that our roll-forward mechanism doesn't recover the xattr node blocks at all. Only the direct node blocks in the WARM_NODE log can be recovered. So, let's resolve the issue simply by conducting checkpoint during fsync when a file has a modified xattr node block. This approach is able to degrade the performance, but normally the checkpoint overhead is shown at the initial fsync call after the xattr entry changes. Once the checkpoint is done, no additional overhead would be occurred. Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/file.c')
-rw-r--r--fs/f2fs/file.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index b7eae98..951ab17 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -158,10 +158,15 @@ int f2fs_sync_file(struct file *file, int datasync)
need_cp = true;
else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino))
need_cp = true;
+ else if (F2FS_I(inode)->xattr_ver ==
+ le64_to_cpu(F2FS_CKPT(sbi)->checkpoint_ver))
+ need_cp = true;
if (need_cp) {
nid_t pino;
+ F2FS_I(inode)->xattr_ver = 0;
+
/* all the dirty node pages should be flushed for POR */
ret = f2fs_sync_fs(inode->i_sb, 1);
if (file_wrong_pino(inode) && inode->i_nlink == 1 &&