summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHou Pengyang <houpengyang@huawei.com>2017-04-25 12:45:13 +0000
committerJaegeuk Kim <jaegeuk@kernel.org>2017-05-08 16:29:05 -0700
commitcf1770e0fa436b62f454732cd0e7842bed61430a (patch)
tree5b5a5365c1c59043d5e89c735c6e3540fd076aac
parentb465728ac362b0b069a3935fb65f1f019ed65ab2 (diff)
f2fs: lookup extent cache first under IPU scenario
If a page is cold, NOT atomit written and need_ipu now, there is a high probability that IPU should be adapted. For IPU, we try to check extent tree to get the block index first, instead of reading the dnode page, where may lead to an useless dnode IO, since no need to update the dnode index for IPU. Signed-off-by: Hou Pengyang <houpengyang@huawei.com> Signed-off-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Conflicts: fs/f2fs/gc.c
-rw-r--r--fs/f2fs/data.c16
-rw-r--r--fs/f2fs/gc.c3
-rw-r--r--fs/f2fs/segment.c1
3 files changed, 17 insertions, 3 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index db9ed78156e8..b89b97be5ee4 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1348,9 +1348,20 @@ int do_write_data_page(struct f2fs_io_info *fio)
struct page *page = fio->page;
struct inode *inode = page->mapping->host;
struct dnode_of_data dn;
+ struct extent_info ei = {0,0,0};
+ bool ipu_force = false;
int err = 0;
set_new_dnode(&dn, inode, NULL, NULL, 0);
+ if (need_inplace_update(fio) &&
+ f2fs_lookup_extent_cache(inode, page->index, &ei)) {
+ fio->old_blkaddr = ei.blk + page->index - ei.fofs;
+ if (fio->old_blkaddr != NULL_ADDR &&
+ fio->old_blkaddr != NEW_ADDR) {
+ ipu_force = true;
+ goto got_it;
+ }
+ }
err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
if (err)
return err;
@@ -1362,7 +1373,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
ClearPageUptodate(page);
goto out_writepage;
}
-
+got_it:
err = encrypt_one_page(fio);
if (err)
goto out_writepage;
@@ -1373,7 +1384,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
* If current allocation needs SSR,
* it had better in-place writes for updated data.
*/
- if (need_inplace_update(fio)) {
+ if (ipu_force || need_inplace_update(fio)) {
f2fs_bug_on(fio->sbi, !fio->cp_rwsem_locked);
f2fs_unlock_op(fio->sbi);
fio->cp_rwsem_locked = false;
@@ -1410,6 +1421,7 @@ static int __write_data_page(struct page *page, bool *submitted,
.type = DATA,
.op = REQ_OP_WRITE,
.op_flags = wbc_to_write_flags(wbc),
+ .old_blkaddr = NULL_ADDR,
.page = page,
.encrypted_page = NULL,
.submitted = false,
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index f3102a895c48..32b3ae415260 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -713,7 +713,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
.sbi = F2FS_I_SB(inode),
.type = DATA,
.op = REQ_OP_WRITE,
- .op_flags = REQ_SYNC | REQ_NOIDLE,
+ .op_flags = REQ_SYNC,
+ .old_blkaddr = NULL_ADDR,
.page = page,
.encrypted_page = NULL,
};
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index a0a0592e1681..69ead09ba06f 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -311,6 +311,7 @@ static int __commit_inmem_pages(struct inode *inode,
}
fio.page = page;
+ fio.old_blkaddr = NULL_ADDR;
err = do_write_data_page(&fio);
if (err) {
unlock_page(page);