This patch introduces two functions:

        1) f2fs_encrypt_page -- encrypt data page before submit_bio
        2) do_rewrite_data_page -- IPU rewrite

The two functions are extraced from do_write_data_page, logic in
do_write_data_page stays unchanged.

Signed-off-by: Hou Pengyang <houpengy...@huawei.com>
Signed-off-by: Chao Yu <yuch...@huawei.com>
---
 fs/f2fs/data.c | 83 ++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 58 insertions(+), 25 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index b8dcd1e..6b18750 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1302,26 +1302,11 @@ static int f2fs_read_data_pages(struct file *file,
        return f2fs_mpage_readpages(mapping, pages, NULL, nr_pages);
 }
 
-int do_write_data_page(struct f2fs_io_info *fio)
+static int f2fs_encrypt_page(struct f2fs_io_info *fio, struct page *page)
 {
-       struct page *page = fio->page;
        struct inode *inode = page->mapping->host;
-       struct dnode_of_data dn;
        int err = 0;
 
-       set_new_dnode(&dn, inode, NULL, NULL, 0);
-       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;
-       }
-
        if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode)) {
                gfp_t gfp_flags = GFP_NOFS;
 
@@ -1343,9 +1328,63 @@ int do_write_data_page(struct f2fs_io_info *fio)
                                err = 0;
                                goto retry_encrypt;
                        }
-                       goto out_writepage;
+                       return err;
                }
        }
+       return err;
+}
+
+static int do_rewrite_data_page(struct f2fs_io_info *fio, struct page *page)
+{
+       struct inode *inode = page->mapping->host;
+       int err;
+
+       f2fs_bug_on(F2FS_P_SB(page), !fio->cp_rwsem_locked);
+
+       f2fs_unlock_op(F2FS_I_SB(inode));
+       fio->cp_rwsem_locked = false;
+       err = rewrite_data_page(fio);
+       set_inode_flag(inode, FI_UPDATE_WRITE);
+       trace_f2fs_do_write_data_page(page, IPU);
+       return err;
+
+}
+
+static inline bool need_inplace_update_block(struct f2fs_io_info *fio, struct 
page *page)
+{
+       struct inode *inode = page->mapping->host;
+
+       if (!is_cold_data(page) &&
+                       !IS_ATOMIC_WRITTEN_PAGE(page) &&
+                       need_inplace_update(inode, fio))
+               return true;
+
+       return false;
+}
+
+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;
+       int err = 0;
+
+       set_new_dnode(&dn, inode, NULL, NULL, 0);
+       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;
+       }
+
+       err = f2fs_encrypt_page(fio, page);
+       if (err)
+               goto out_writepage;
 
        set_page_writeback(page);
 
@@ -1354,14 +1393,8 @@ int do_write_data_page(struct f2fs_io_info *fio)
         * it had better in-place writes for updated data.
         */
        if (unlikely(fio->old_blkaddr != NEW_ADDR &&
-                       !is_cold_data(page) &&
-                       !IS_ATOMIC_WRITTEN_PAGE(page) &&
-                       need_inplace_update(inode, fio))) {
-               f2fs_unlock_op(F2FS_I_SB(inode));
-               fio->cp_rwsem_locked = false;
-               err = rewrite_data_page(fio);
-               set_inode_flag(inode, FI_UPDATE_WRITE);
-               trace_f2fs_do_write_data_page(page, IPU);
+                       need_inplace_update_block(fio, page))) {
+               err = do_rewrite_data_page(fio, page);
        } else {
                write_data_page(&dn, fio);
                trace_f2fs_do_write_data_page(page, OPU);
-- 
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

Reply via email to