aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/gc.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index 6691f526fa40..8974672db78f 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -796,6 +796,29 @@ static int move_data_block(struct inode *inode, block_t bidx,
796 if (lfs_mode) 796 if (lfs_mode)
797 down_write(&fio.sbi->io_order_lock); 797 down_write(&fio.sbi->io_order_lock);
798 798
799 mpage = f2fs_grab_cache_page(META_MAPPING(fio.sbi),
800 fio.old_blkaddr, false);
801 if (!mpage)
802 goto up_out;
803
804 fio.encrypted_page = mpage;
805
806 /* read source block in mpage */
807 if (!PageUptodate(mpage)) {
808 err = f2fs_submit_page_bio(&fio);
809 if (err) {
810 f2fs_put_page(mpage, 1);
811 goto up_out;
812 }
813 lock_page(mpage);
814 if (unlikely(mpage->mapping != META_MAPPING(fio.sbi) ||
815 !PageUptodate(mpage))) {
816 err = -EIO;
817 f2fs_put_page(mpage, 1);
818 goto up_out;
819 }
820 }
821
799 f2fs_allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr, 822 f2fs_allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr,
800 &sum, CURSEG_COLD_DATA, NULL, false); 823 &sum, CURSEG_COLD_DATA, NULL, false);
801 824
@@ -803,44 +826,18 @@ static int move_data_block(struct inode *inode, block_t bidx,
803 newaddr, FGP_LOCK | FGP_CREAT, GFP_NOFS); 826 newaddr, FGP_LOCK | FGP_CREAT, GFP_NOFS);
804 if (!fio.encrypted_page) { 827 if (!fio.encrypted_page) {
805 err = -ENOMEM; 828 err = -ENOMEM;
806 goto recover_block;
807 }
808
809 mpage = f2fs_pagecache_get_page(META_MAPPING(fio.sbi),
810 fio.old_blkaddr, FGP_LOCK, GFP_NOFS);
811 if (mpage) {
812 bool updated = false;
813
814 if (PageUptodate(mpage)) {
815 memcpy(page_address(fio.encrypted_page),
816 page_address(mpage), PAGE_SIZE);
817 updated = true;
818 }
819 f2fs_put_page(mpage, 1); 829 f2fs_put_page(mpage, 1);
820 invalidate_mapping_pages(META_MAPPING(fio.sbi), 830 goto recover_block;
821 fio.old_blkaddr, fio.old_blkaddr);
822 if (updated)
823 goto write_page;
824 }
825
826 err = f2fs_submit_page_bio(&fio);
827 if (err)
828 goto put_page_out;
829
830 /* write page */
831 lock_page(fio.encrypted_page);
832
833 if (unlikely(fio.encrypted_page->mapping != META_MAPPING(fio.sbi))) {
834 err = -EIO;
835 goto put_page_out;
836 }
837 if (unlikely(!PageUptodate(fio.encrypted_page))) {
838 err = -EIO;
839 goto put_page_out;
840 } 831 }
841 832
842write_page: 833 /* write target block */
843 f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true, true); 834 f2fs_wait_on_page_writeback(fio.encrypted_page, DATA, true, true);
835 memcpy(page_address(fio.encrypted_page),
836 page_address(mpage), PAGE_SIZE);
837 f2fs_put_page(mpage, 1);
838 invalidate_mapping_pages(META_MAPPING(fio.sbi),
839 fio.old_blkaddr, fio.old_blkaddr);
840
844 set_page_dirty(fio.encrypted_page); 841 set_page_dirty(fio.encrypted_page);
845 if (clear_page_dirty_for_io(fio.encrypted_page)) 842 if (clear_page_dirty_for_io(fio.encrypted_page))
846 dec_page_count(fio.sbi, F2FS_DIRTY_META); 843 dec_page_count(fio.sbi, F2FS_DIRTY_META);
@@ -871,11 +868,12 @@ write_page:
871put_page_out: 868put_page_out:
872 f2fs_put_page(fio.encrypted_page, 1); 869 f2fs_put_page(fio.encrypted_page, 1);
873recover_block: 870recover_block:
874 if (lfs_mode)
875 up_write(&fio.sbi->io_order_lock);
876 if (err) 871 if (err)
877 f2fs_do_replace_block(fio.sbi, &sum, newaddr, fio.old_blkaddr, 872 f2fs_do_replace_block(fio.sbi, &sum, newaddr, fio.old_blkaddr,
878 true, true); 873 true, true);
874up_out:
875 if (lfs_mode)
876 up_write(&fio.sbi->io_order_lock);
879put_out: 877put_out:
880 f2fs_put_dnode(&dn); 878 f2fs_put_dnode(&dn);
881out: 879out: