Skip to content

Commit fccaa81

Browse files
Daeho JeongJaegeuk Kim
authored andcommitted
f2fs: prevent atomic file from being dirtied before commit
Keep atomic file clean while updating and make it dirtied during commit in order to avoid unnecessary and excessive inode updates in the previous fix. Fixes: 4bf7832 ("f2fs: mark inode dirty for FI_ATOMIC_COMMITTED flag") Signed-off-by: Daeho Jeong <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 5697e94 commit fccaa81

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

fs/f2fs/f2fs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ enum {
808808
FI_ALIGNED_WRITE, /* enable aligned write */
809809
FI_COW_FILE, /* indicate COW file */
810810
FI_ATOMIC_COMMITTED, /* indicate atomic commit completed except disk sync */
811+
FI_ATOMIC_DIRTIED, /* indicate atomic file is dirtied */
811812
FI_ATOMIC_REPLACE, /* indicate atomic replace */
812813
FI_OPENED_FILE, /* indicate file has been opened */
813814
FI_MAX, /* max flag, never be used */
@@ -3067,7 +3068,6 @@ static inline void __mark_inode_dirty_flag(struct inode *inode,
30673068
case FI_INLINE_DOTS:
30683069
case FI_PIN_FILE:
30693070
case FI_COMPRESS_RELEASED:
3070-
case FI_ATOMIC_COMMITTED:
30713071
f2fs_mark_inode_dirty_sync(inode, true);
30723072
}
30733073
}

fs/f2fs/inode.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)
3434
if (f2fs_inode_dirtied(inode, sync))
3535
return;
3636

37+
if (f2fs_is_atomic_file(inode)) {
38+
set_inode_flag(inode, FI_ATOMIC_DIRTIED);
39+
return;
40+
}
41+
3742
mark_inode_dirty_sync(inode);
3843
}
3944

fs/f2fs/segment.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ void f2fs_abort_atomic_write(struct inode *inode, bool clean)
199199
clear_inode_flag(inode, FI_ATOMIC_COMMITTED);
200200
clear_inode_flag(inode, FI_ATOMIC_REPLACE);
201201
clear_inode_flag(inode, FI_ATOMIC_FILE);
202+
if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) {
203+
clear_inode_flag(inode, FI_ATOMIC_DIRTIED);
204+
f2fs_mark_inode_dirty_sync(inode, true);
205+
}
202206
stat_dec_atomic_inode(inode);
203207

204208
F2FS_I(inode)->atomic_write_task = NULL;
@@ -366,6 +370,10 @@ static int __f2fs_commit_atomic_write(struct inode *inode)
366370
} else {
367371
sbi->committed_atomic_block += fi->atomic_write_cnt;
368372
set_inode_flag(inode, FI_ATOMIC_COMMITTED);
373+
if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) {
374+
clear_inode_flag(inode, FI_ATOMIC_DIRTIED);
375+
f2fs_mark_inode_dirty_sync(inode, true);
376+
}
369377
}
370378

371379
__complete_revoke_list(inode, &revoke_list, ret ? true : false);

0 commit comments

Comments
 (0)