|
@@ -75,6 +75,82 @@ out:
|
|
|
return page;
|
|
|
}
|
|
|
|
|
|
+inline int get_max_meta_blks(struct f2fs_sb_info *sbi, int type)
|
|
|
+{
|
|
|
+ switch (type) {
|
|
|
+ case META_NAT:
|
|
|
+ return NM_I(sbi)->max_nid / NAT_ENTRY_PER_BLOCK;
|
|
|
+ case META_SIT:
|
|
|
+ return SIT_BLK_CNT(sbi);
|
|
|
+ case META_CP:
|
|
|
+ return 0;
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Readahead CP/NAT/SIT pages
|
|
|
+ */
|
|
|
+int ra_meta_pages(struct f2fs_sb_info *sbi, int start, int nrpages, int type)
|
|
|
+{
|
|
|
+ block_t prev_blk_addr = 0;
|
|
|
+ struct page *page;
|
|
|
+ int blkno = start;
|
|
|
+ int max_blks = get_max_meta_blks(sbi, type);
|
|
|
+
|
|
|
+ struct f2fs_io_info fio = {
|
|
|
+ .type = META,
|
|
|
+ .rw = READ_SYNC | REQ_META | REQ_PRIO
|
|
|
+ };
|
|
|
+
|
|
|
+ for (; nrpages-- > 0; blkno++) {
|
|
|
+ block_t blk_addr;
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case META_NAT:
|
|
|
+ /* get nat block addr */
|
|
|
+ if (unlikely(blkno >= max_blks))
|
|
|
+ blkno = 0;
|
|
|
+ blk_addr = current_nat_addr(sbi,
|
|
|
+ blkno * NAT_ENTRY_PER_BLOCK);
|
|
|
+ break;
|
|
|
+ case META_SIT:
|
|
|
+ /* get sit block addr */
|
|
|
+ if (unlikely(blkno >= max_blks))
|
|
|
+ goto out;
|
|
|
+ blk_addr = current_sit_addr(sbi,
|
|
|
+ blkno * SIT_ENTRY_PER_BLOCK);
|
|
|
+ if (blkno != start && prev_blk_addr + 1 != blk_addr)
|
|
|
+ goto out;
|
|
|
+ prev_blk_addr = blk_addr;
|
|
|
+ break;
|
|
|
+ case META_CP:
|
|
|
+ /* get cp block addr */
|
|
|
+ blk_addr = blkno;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+
|
|
|
+ page = grab_cache_page(META_MAPPING(sbi), blk_addr);
|
|
|
+ if (!page)
|
|
|
+ continue;
|
|
|
+ if (PageUptodate(page)) {
|
|
|
+ mark_page_accessed(page);
|
|
|
+ f2fs_put_page(page, 1);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ f2fs_submit_page_mbio(sbi, page, blk_addr, &fio);
|
|
|
+ mark_page_accessed(page);
|
|
|
+ f2fs_put_page(page, 0);
|
|
|
+ }
|
|
|
+out:
|
|
|
+ f2fs_submit_merged_bio(sbi, META, READ);
|
|
|
+ return blkno - start;
|
|
|
+}
|
|
|
+
|
|
|
static int f2fs_write_meta_page(struct page *page,
|
|
|
struct writeback_control *wbc)
|
|
|
{
|
|
@@ -298,6 +374,8 @@ void recover_orphan_inodes(struct f2fs_sb_info *sbi)
|
|
|
start_blk = __start_cp_addr(sbi) + 1;
|
|
|
orphan_blkaddr = __start_sum_addr(sbi) - 1;
|
|
|
|
|
|
+ ra_meta_pages(sbi, start_blk, orphan_blkaddr, META_CP);
|
|
|
+
|
|
|
for (i = 0; i < orphan_blkaddr; i++) {
|
|
|
struct page *page = get_meta_page(sbi, start_blk + i);
|
|
|
struct f2fs_orphan_block *orphan_blk;
|