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 <houpengy...@huawei.com> Signed-off-by: Chao Yu <yuch...@huawei.com> --- fs/f2fs/data.c | 11 ++++++++++- fs/f2fs/gc.c | 1 + fs/f2fs/segment.c | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 02400b0..183a426 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1346,21 +1346,29 @@ 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}; 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) + goto got_it; + } err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE); if (err) return err; fio->old_blkaddr = dn.data_blkaddr; - /* This page is already truncated */ if (fio->old_blkaddr == NULL_ADDR) { ClearPageUptodate(page); goto out_writepage; } +got_it: err = encrypt_one_page(fio); if (err) goto out_writepage; @@ -1408,6 +1416,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 499a43f..e034857 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -712,6 +712,7 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type, .type = DATA, .op = REQ_OP_WRITE, .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 2a95535..9f86b98 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -291,6 +291,7 @@ static int __commit_inmem_pages(struct inode *inode, .type = DATA, .op = REQ_OP_WRITE, .op_flags = REQ_SYNC | REQ_PRIO, + .old_blkaddr = NULL_ADDR, .encrypted_page = NULL, }; pgoff_t last_idx = ULONG_MAX; -- 2.10.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel