Commit e959c8f5 authored by Hou Pengyang's avatar Hou Pengyang Committed by Jaegeuk Kim

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: default avatarHou Pengyang <houpengyang@huawei.com>
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 7eab0c0d
...@@ -1350,9 +1350,20 @@ int do_write_data_page(struct f2fs_io_info *fio) ...@@ -1350,9 +1350,20 @@ int do_write_data_page(struct f2fs_io_info *fio)
struct page *page = fio->page; struct page *page = fio->page;
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct dnode_of_data dn; struct dnode_of_data dn;
struct extent_info ei = {0,0,0};
bool ipu_force = false;
int err = 0; int err = 0;
set_new_dnode(&dn, inode, NULL, NULL, 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); err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
if (err) if (err)
return err; return err;
...@@ -1364,7 +1375,7 @@ int do_write_data_page(struct f2fs_io_info *fio) ...@@ -1364,7 +1375,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
ClearPageUptodate(page); ClearPageUptodate(page);
goto out_writepage; goto out_writepage;
} }
got_it:
err = encrypt_one_page(fio); err = encrypt_one_page(fio);
if (err) if (err)
goto out_writepage; goto out_writepage;
...@@ -1375,7 +1386,7 @@ int do_write_data_page(struct f2fs_io_info *fio) ...@@ -1375,7 +1386,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
* If current allocation needs SSR, * If current allocation needs SSR,
* it had better in-place writes for updated data. * 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_bug_on(fio->sbi, !fio->cp_rwsem_locked);
f2fs_unlock_op(fio->sbi); f2fs_unlock_op(fio->sbi);
fio->cp_rwsem_locked = false; fio->cp_rwsem_locked = false;
...@@ -1412,6 +1423,7 @@ static int __write_data_page(struct page *page, bool *submitted, ...@@ -1412,6 +1423,7 @@ static int __write_data_page(struct page *page, bool *submitted,
.type = DATA, .type = DATA,
.op = REQ_OP_WRITE, .op = REQ_OP_WRITE,
.op_flags = wbc_to_write_flags(wbc), .op_flags = wbc_to_write_flags(wbc),
.old_blkaddr = NULL_ADDR,
.page = page, .page = page,
.encrypted_page = NULL, .encrypted_page = NULL,
.submitted = false, .submitted = false,
......
...@@ -714,6 +714,7 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type, ...@@ -714,6 +714,7 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
.type = DATA, .type = DATA,
.op = REQ_OP_WRITE, .op = REQ_OP_WRITE,
.op_flags = REQ_SYNC, .op_flags = REQ_SYNC,
.old_blkaddr = NULL_ADDR,
.page = page, .page = page,
.encrypted_page = NULL, .encrypted_page = NULL,
}; };
......
...@@ -311,6 +311,7 @@ static int __commit_inmem_pages(struct inode *inode, ...@@ -311,6 +311,7 @@ static int __commit_inmem_pages(struct inode *inode,
} }
fio.page = page; fio.page = page;
fio.old_blkaddr = NULL_ADDR;
err = do_write_data_page(&fio); err = do_write_data_page(&fio);
if (err) { if (err) {
unlock_page(page); unlock_page(page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment