diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-01-20 10:43:51 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-02-22 19:07:23 -0500 |
commit | fec1d6576cdf2ce13f84fcdf7b20d02a05f76fc6 (patch) | |
tree | a413bdb72037dedf3bace051d93683591690cd5b /fs/f2fs/segment.c | |
parent | 718e53fa633f84d09acb4b76f1ad572ccbf75a12 (diff) |
f2fs: use wait_for_stable_page to avoid contention
In write_begin, if storage supports stable_page, we don't need to wait for
writeback to update its contents.
This patch introduces to use wait_for_stable_page instead of
wait_on_page_writeback.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/segment.c')
-rw-r--r-- | fs/f2fs/segment.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 9e3276067526..7cd07d54be4e 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -223,7 +223,8 @@ int commit_inmem_pages(struct inode *inode, bool abort) | |||
223 | if (!abort) { | 223 | if (!abort) { |
224 | if (cur->page->mapping == inode->i_mapping) { | 224 | if (cur->page->mapping == inode->i_mapping) { |
225 | set_page_dirty(cur->page); | 225 | set_page_dirty(cur->page); |
226 | f2fs_wait_on_page_writeback(cur->page, DATA); | 226 | f2fs_wait_on_page_writeback(cur->page, DATA, |
227 | true); | ||
227 | if (clear_page_dirty_for_io(cur->page)) | 228 | if (clear_page_dirty_for_io(cur->page)) |
228 | inode_dec_dirty_pages(inode); | 229 | inode_dec_dirty_pages(inode); |
229 | trace_f2fs_commit_inmem_page(cur->page, INMEM); | 230 | trace_f2fs_commit_inmem_page(cur->page, INMEM); |
@@ -1416,14 +1417,17 @@ void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn, | |||
1416 | } | 1417 | } |
1417 | 1418 | ||
1418 | void f2fs_wait_on_page_writeback(struct page *page, | 1419 | void f2fs_wait_on_page_writeback(struct page *page, |
1419 | enum page_type type) | 1420 | enum page_type type, bool ordered) |
1420 | { | 1421 | { |
1421 | if (PageWriteback(page)) { | 1422 | if (PageWriteback(page)) { |
1422 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | 1423 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); |
1423 | 1424 | ||
1424 | if (is_merged_page(sbi, page, type)) | 1425 | if (is_merged_page(sbi, page, type)) |
1425 | f2fs_submit_merged_bio(sbi, type, WRITE); | 1426 | f2fs_submit_merged_bio(sbi, type, WRITE); |
1426 | wait_on_page_writeback(page); | 1427 | if (ordered) |
1428 | wait_on_page_writeback(page); | ||
1429 | else | ||
1430 | wait_for_stable_page(page); | ||
1427 | } | 1431 | } |
1428 | } | 1432 | } |
1429 | 1433 | ||
@@ -1439,7 +1443,7 @@ void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *sbi, | |||
1439 | 1443 | ||
1440 | cpage = find_lock_page(META_MAPPING(sbi), blkaddr); | 1444 | cpage = find_lock_page(META_MAPPING(sbi), blkaddr); |
1441 | if (cpage) { | 1445 | if (cpage) { |
1442 | f2fs_wait_on_page_writeback(cpage, DATA); | 1446 | f2fs_wait_on_page_writeback(cpage, DATA, true); |
1443 | f2fs_put_page(cpage, 1); | 1447 | f2fs_put_page(cpage, 1); |
1444 | } | 1448 | } |
1445 | } | 1449 | } |