@@ -599,6 +599,72 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
599
599
return true;
600
600
}
601
601
602
+ static int ra_data_block (struct inode * inode , pgoff_t index )
603
+ {
604
+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
605
+ struct address_space * mapping = inode -> i_mapping ;
606
+ struct dnode_of_data dn ;
607
+ struct page * page ;
608
+ struct extent_info ei = {0 , 0 , 0 };
609
+ struct f2fs_io_info fio = {
610
+ .sbi = sbi ,
611
+ .ino = inode -> i_ino ,
612
+ .type = DATA ,
613
+ .temp = COLD ,
614
+ .op = REQ_OP_READ ,
615
+ .op_flags = 0 ,
616
+ .encrypted_page = NULL ,
617
+ .in_list = false,
618
+ .retry = false,
619
+ };
620
+ int err ;
621
+
622
+ page = f2fs_grab_cache_page (mapping , index , true);
623
+ if (!page )
624
+ return - ENOMEM ;
625
+
626
+ if (f2fs_lookup_extent_cache (inode , index , & ei )) {
627
+ dn .data_blkaddr = ei .blk + index - ei .fofs ;
628
+ goto got_it ;
629
+ }
630
+
631
+ set_new_dnode (& dn , inode , NULL , NULL , 0 );
632
+ err = f2fs_get_dnode_of_data (& dn , index , LOOKUP_NODE );
633
+ if (err )
634
+ goto put_page ;
635
+ f2fs_put_dnode (& dn );
636
+
637
+ if (unlikely (!f2fs_is_valid_blkaddr (sbi , dn .data_blkaddr ,
638
+ DATA_GENERIC ))) {
639
+ err = - EFAULT ;
640
+ goto put_page ;
641
+ }
642
+ got_it :
643
+ /* read page */
644
+ fio .page = page ;
645
+ fio .new_blkaddr = fio .old_blkaddr = dn .data_blkaddr ;
646
+
647
+ fio .encrypted_page = f2fs_pagecache_get_page (META_MAPPING (sbi ),
648
+ dn .data_blkaddr ,
649
+ FGP_LOCK | FGP_CREAT , GFP_NOFS );
650
+ if (!fio .encrypted_page ) {
651
+ err = - ENOMEM ;
652
+ goto put_page ;
653
+ }
654
+
655
+ err = f2fs_submit_page_bio (& fio );
656
+ if (err )
657
+ goto put_encrypted_page ;
658
+ f2fs_put_page (fio .encrypted_page , 0 );
659
+ f2fs_put_page (page , 1 );
660
+ return 0 ;
661
+ put_encrypted_page :
662
+ f2fs_put_page (fio .encrypted_page , 1 );
663
+ put_page :
664
+ f2fs_put_page (page , 1 );
665
+ return err ;
666
+ }
667
+
602
668
/*
603
669
* Move data block via META_MAPPING while keeping locked data page.
604
670
* This can be used to move blocks, aka LBAs, directly on disk.
@@ -620,7 +686,7 @@ static void move_data_block(struct inode *inode, block_t bidx,
620
686
struct dnode_of_data dn ;
621
687
struct f2fs_summary sum ;
622
688
struct node_info ni ;
623
- struct page * page ;
689
+ struct page * page , * mpage ;
624
690
block_t newaddr ;
625
691
int err ;
626
692
bool lfs_mode = test_opt (fio .sbi , LFS );
@@ -683,6 +749,23 @@ static void move_data_block(struct inode *inode, block_t bidx,
683
749
goto recover_block ;
684
750
}
685
751
752
+ mpage = f2fs_pagecache_get_page (META_MAPPING (fio .sbi ),
753
+ fio .old_blkaddr , FGP_LOCK , GFP_NOFS );
754
+ if (mpage ) {
755
+ bool updated = false;
756
+
757
+ if (PageUptodate (mpage )) {
758
+ memcpy (page_address (fio .encrypted_page ),
759
+ page_address (mpage ), PAGE_SIZE );
760
+ updated = true;
761
+ }
762
+ f2fs_put_page (mpage , 1 );
763
+ invalidate_mapping_pages (META_MAPPING (fio .sbi ),
764
+ fio .old_blkaddr , fio .old_blkaddr );
765
+ if (updated )
766
+ goto write_page ;
767
+ }
768
+
686
769
err = f2fs_submit_page_bio (& fio );
687
770
if (err )
688
771
goto put_page_out ;
@@ -699,6 +782,7 @@ static void move_data_block(struct inode *inode, block_t bidx,
699
782
goto put_page_out ;
700
783
}
701
784
785
+ write_page :
702
786
set_page_dirty (fio .encrypted_page );
703
787
f2fs_wait_on_page_writeback (fio .encrypted_page , DATA , true);
704
788
if (clear_page_dirty_for_io (fio .encrypted_page ))
@@ -873,23 +957,30 @@ static void gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
873
957
if (IS_ERR (inode ) || is_bad_inode (inode ))
874
958
continue ;
875
959
876
- /* if inode uses special I/O path, let's go phase 3 */
877
- if (f2fs_post_read_required (inode )) {
878
- add_gc_inode (gc_list , inode );
879
- continue ;
880
- }
881
-
882
960
if (!down_write_trylock (
883
961
& F2FS_I (inode )-> i_gc_rwsem [WRITE ])) {
884
962
iput (inode );
885
963
sbi -> skipped_gc_rwsem ++ ;
886
964
continue ;
887
965
}
888
966
889
- start_bidx = f2fs_start_bidx_of_node (nofs , inode );
967
+ start_bidx = f2fs_start_bidx_of_node (nofs , inode ) +
968
+ ofs_in_node ;
969
+
970
+ if (f2fs_post_read_required (inode )) {
971
+ int err = ra_data_block (inode , start_bidx );
972
+
973
+ up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
974
+ if (err ) {
975
+ iput (inode );
976
+ continue ;
977
+ }
978
+ add_gc_inode (gc_list , inode );
979
+ continue ;
980
+ }
981
+
890
982
data_page = f2fs_get_read_data_page (inode ,
891
- start_bidx + ofs_in_node , REQ_RAHEAD ,
892
- true);
983
+ start_bidx , REQ_RAHEAD , true);
893
984
up_write (& F2FS_I (inode )-> i_gc_rwsem [WRITE ]);
894
985
if (IS_ERR (data_page )) {
895
986
iput (inode );
0 commit comments