Signed-off-by: Hou Pengyang <[email protected]>
Signed-off-by: Chao Yu <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel