Skip to content

Commit db03c20

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: fix to set atomic write status more clear
1. After we start atomic write in a database file, before committing all data, we'd better not set inode w/ vfs dirty status to avoid redundant updates, instead, we only set inode w/ atomic dirty status. 2. After we commit all data, before committing metadata, we need to clear atomic dirty status, and set vfs dirty status to allow vfs flush dirty inode. Cc: Daeho Jeong <[email protected]> Reported-by: Zhiguo Niu <[email protected]> Signed-off-by: Chao Yu <[email protected]> Reviewed-by: Daeho Jeong <[email protected]> Reviewed-by: Zhiguo Niu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 2be96c2 commit db03c20

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

fs/f2fs/inode.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ 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))
37+
/* only atomic file w/ FI_ATOMIC_COMMITTED can be set vfs dirty */
38+
if (f2fs_is_atomic_file(inode) &&
39+
!is_inode_flag_set(inode, FI_ATOMIC_COMMITTED))
3840
return;
3941

4042
mark_inode_dirty_sync(inode);

fs/f2fs/segment.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,13 @@ static int __f2fs_commit_atomic_write(struct inode *inode)
376376
} else {
377377
sbi->committed_atomic_block += fi->atomic_write_cnt;
378378
set_inode_flag(inode, FI_ATOMIC_COMMITTED);
379+
380+
/*
381+
* inode may has no FI_ATOMIC_DIRTIED flag due to no write
382+
* before commit.
383+
*/
379384
if (is_inode_flag_set(inode, FI_ATOMIC_DIRTIED)) {
385+
/* clear atomic dirty status and set vfs dirty status */
380386
clear_inode_flag(inode, FI_ATOMIC_DIRTIED);
381387
f2fs_mark_inode_dirty_sync(inode, true);
382388
}

fs/f2fs/super.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1532,7 +1532,9 @@ int f2fs_inode_dirtied(struct inode *inode, bool sync)
15321532
}
15331533
spin_unlock(&sbi->inode_lock[DIRTY_META]);
15341534

1535-
if (!ret && f2fs_is_atomic_file(inode))
1535+
/* if atomic write is not committed, set inode w/ atomic dirty */
1536+
if (!ret && f2fs_is_atomic_file(inode) &&
1537+
!is_inode_flag_set(inode, FI_ATOMIC_COMMITTED))
15361538
set_inode_flag(inode, FI_ATOMIC_DIRTIED);
15371539

15381540
return ret;

0 commit comments

Comments
 (0)