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 <[email protected]>
---
 fs/f2fs/data.c | 66 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 44 insertions(+), 22 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index b8dcd1e..4ba11a6 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,50 @@ 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;
+
+}
+
+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;
+       }
+
+       if (f2fs_encrypt_page(fio, page))
+               goto out_writepage;
 
        set_page_writeback(page);
 
@@ -1357,11 +1383,7 @@ int do_write_data_page(struct f2fs_io_info *fio)
                        !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);
+               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
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to