|
@@ -553,6 +553,7 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
|
|
struct f2fs_summary sum;
|
|
|
struct node_info ni;
|
|
|
struct page *page;
|
|
|
+ block_t newaddr;
|
|
|
int err;
|
|
|
|
|
|
/* do not read out */
|
|
@@ -583,12 +584,15 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
|
|
fio.page = page;
|
|
|
fio.new_blkaddr = fio.old_blkaddr = dn.data_blkaddr;
|
|
|
|
|
|
- fio.encrypted_page = pagecache_get_page(META_MAPPING(fio.sbi),
|
|
|
- fio.new_blkaddr,
|
|
|
- FGP_LOCK|FGP_CREAT,
|
|
|
- GFP_NOFS);
|
|
|
- if (!fio.encrypted_page)
|
|
|
- goto put_out;
|
|
|
+ allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr,
|
|
|
+ &sum, CURSEG_COLD_DATA);
|
|
|
+
|
|
|
+ fio.encrypted_page = pagecache_get_page(META_MAPPING(fio.sbi), newaddr,
|
|
|
+ FGP_LOCK | FGP_CREAT, GFP_NOFS);
|
|
|
+ if (!fio.encrypted_page) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto recover_block;
|
|
|
+ }
|
|
|
|
|
|
err = f2fs_submit_page_bio(&fio);
|
|
|
if (err)
|
|
@@ -597,10 +601,14 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
|
|
/* write page */
|
|
|
lock_page(fio.encrypted_page);
|
|
|
|
|
|
- if (unlikely(!PageUptodate(fio.encrypted_page)))
|
|
|
+ if (unlikely(!PageUptodate(fio.encrypted_page))) {
|
|
|
+ err = -EIO;
|
|
|
goto put_page_out;
|
|
|
- if (unlikely(fio.encrypted_page->mapping != META_MAPPING(fio.sbi)))
|
|
|
+ }
|
|
|
+ if (unlikely(fio.encrypted_page->mapping != META_MAPPING(fio.sbi))) {
|
|
|
+ err = -EIO;
|
|
|
goto put_page_out;
|
|
|
+ }
|
|
|
|
|
|
set_page_dirty(fio.encrypted_page);
|
|
|
f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true);
|
|
@@ -611,9 +619,9 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
|
|
|
|
|
/* allocate block address */
|
|
|
f2fs_wait_on_page_writeback(dn.node_page, NODE, true);
|
|
|
- allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &fio.new_blkaddr,
|
|
|
- &sum, CURSEG_COLD_DATA);
|
|
|
+
|
|
|
fio.rw = WRITE_SYNC;
|
|
|
+ fio.new_blkaddr = newaddr;
|
|
|
f2fs_submit_page_mbio(&fio);
|
|
|
|
|
|
dn.data_blkaddr = fio.new_blkaddr;
|
|
@@ -624,6 +632,10 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
|
|
|
set_inode_flag(F2FS_I(inode), FI_FIRST_BLOCK_WRITTEN);
|
|
|
put_page_out:
|
|
|
f2fs_put_page(fio.encrypted_page, 1);
|
|
|
+recover_block:
|
|
|
+ if (err)
|
|
|
+ __f2fs_replace_block(fio.sbi, &sum, newaddr, fio.old_blkaddr,
|
|
|
+ true, true);
|
|
|
put_out:
|
|
|
f2fs_put_dnode(&dn);
|
|
|
out:
|