[PATCH 1/2] f2fs: avoid race in between atomic_read & atomic_inc
Previously, we will miss merging flush command during fsync due to below race condition: Thread AThread BThread C - f2fs_issue_flush - atomic_read(_flush) - f2fs_issue_flush - atomic_read(_flush) - f2fs_issue_flush - atomic_read(_flush) - atomic_inc(_flush) - atomic_inc(_flush) - atomic_inc(_flush) - submit_flush_wait - submit_flush_wait - submit_flush_wait It needs to use atomic_inc_return instead to avoid such race. Signed-off-by: Chao Yu--- fs/f2fs/segment.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index d6c3f456ea51..1215ca1bd4e2 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -536,8 +536,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) return ret; } - if (!atomic_read(>issing_flush)) { - atomic_inc(>issing_flush); + if (atomic_inc_return(>issing_flush) == 1) { ret = submit_flush_wait(sbi); atomic_dec(>issing_flush); @@ -547,7 +546,6 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) init_completion(); - atomic_inc(>issing_flush); llist_add(, >issue_list); /* update issue_list before we wake up issue_flush thread */ -- 2.13.1.388.g69e6b9b4f4a9
[PATCH 1/2] f2fs: avoid race in between atomic_read & atomic_inc
Previously, we will miss merging flush command during fsync due to below race condition: Thread AThread BThread C - f2fs_issue_flush - atomic_read(_flush) - f2fs_issue_flush - atomic_read(_flush) - f2fs_issue_flush - atomic_read(_flush) - atomic_inc(_flush) - atomic_inc(_flush) - atomic_inc(_flush) - submit_flush_wait - submit_flush_wait - submit_flush_wait It needs to use atomic_inc_return instead to avoid such race. Signed-off-by: Chao Yu --- fs/f2fs/segment.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index d6c3f456ea51..1215ca1bd4e2 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -536,8 +536,7 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) return ret; } - if (!atomic_read(>issing_flush)) { - atomic_inc(>issing_flush); + if (atomic_inc_return(>issing_flush) == 1) { ret = submit_flush_wait(sbi); atomic_dec(>issing_flush); @@ -547,7 +546,6 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi) init_completion(); - atomic_inc(>issing_flush); llist_add(, >issue_list); /* update issue_list before we wake up issue_flush thread */ -- 2.13.1.388.g69e6b9b4f4a9