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