]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
f2fs: lookup extent cache first under IPU scenario
authorHou Pengyang <houpengyang@huawei.com>
Tue, 25 Apr 2017 12:45:13 +0000 (12:45 +0000)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 3 May 2017 04:19:47 +0000 (21:19 -0700)
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>
fs/f2fs/data.c
fs/f2fs/gc.c
fs/f2fs/segment.c

index dfc974c95dd28dc1daddf8678498701c02079f36..ca21ecbd6bbda4dd7da83457fa067ff92ba4fe3b 100644 (file)
@@ -1350,9 +1350,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;
@@ -1364,7 +1375,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;
@@ -1375,7 +1386,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;
@@ -1412,6 +1423,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,
index 84db41ca27c12239fa5ab803ae74d4289ba7593c..c2a9ae8397d3174f312f0baa6fd592733d9a2bc4 100644 (file)
@@ -714,6 +714,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,
                };
index 35d5d49e7614589e334ae669e99574a622b667a3..38b97ad6bceb1ebfd06163f7c709db659fb3a5ba 100644 (file)
@@ -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);