Hi Pengyang,
On 04/25, Hou Pengyang wrote:
> 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 <[email protected]>
> Signed-off-by: Chao Yu <[email protected]>
> ---
> 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)
ipu_force = true;
I added one variable to do below ipu explicitly.
Thanks,
> + 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
------------------------------------------------------------------------------
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