Signed-off-by: Hou Pengyang <houpengy...@huawei.com> Signed-off-by: Chao Yu <yuch...@huawei.com> --- fs/f2fs/data.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 6b18750..1c99ae1 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1367,8 +1367,32 @@ 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; + /* + * 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. + */ + if (unlikely(need_inplace_update_block(fio, page) && + f2fs_lookup_extent_cache(inode, page->index, &ei))) { + + fio->old_blkaddr = ei.blk + page->index - ei.fofs; + + if (fio->old_blkaddr != NEW_ADDR && + fio->old_blkaddr != NULL_ADDR) { + err = f2fs_encrypt_page(fio, page); + if (err) + return err; + set_page_writeback(page); + err = do_rewrite_data_page(fio, page); + return err; + } + } + set_new_dnode(&dn, inode, NULL, NULL, 0); err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE); if (err) -- 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