diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-10-29 22:37:22 +0100 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-11-05 02:34:14 +0100 |
commit | 6a8f8ca582a1bafe6b620e000316206c8719f1d0 (patch) | |
tree | c66b23b131af9dceb04004d8851cbcbb17467bba /fs/f2fs/checkpoint.c | |
parent | f2fs: send discard commands in larger extent (diff) | |
download | linux-6a8f8ca582a1bafe6b620e000316206c8719f1d0.tar.xz linux-6a8f8ca582a1bafe6b620e000316206c8719f1d0.zip |
f2fs: avoid race condition in handling wait_io
__submit_merged_bio f2fs_write_end_io f2fs_write_end_io
wait_io = X wait_io = x
complete(X) complete(X)
wait_io = NULL
wait_for_completion()
free(X)
spin_lock(X)
kernel panic
In order to avoid this, this patch removes the wait_io facility.
Instead, we can use wait_on_all_pages_writeback(sbi) to wait for end_ios.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/checkpoint.c')
-rw-r--r-- | fs/f2fs/checkpoint.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index ca514d599b79..dd6a357a59de 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -978,6 +978,9 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) /* Here, we only have one bio having CP pack */ sync_meta_pages(sbi, META_FLUSH, LONG_MAX); + /* wait for previous submitted meta pages writeback */ + wait_on_all_pages_writeback(sbi); + release_dirty_inode(sbi); if (unlikely(f2fs_cp_error(sbi))) |