diff options
Diffstat (limited to 'fs/f2fs/checkpoint.c')
-rw-r--r-- | fs/f2fs/checkpoint.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 7f794b72b3b7..a5e17a2a0781 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c | |||
@@ -276,7 +276,7 @@ continue_unlock: | |||
276 | if (!clear_page_dirty_for_io(page)) | 276 | if (!clear_page_dirty_for_io(page)) |
277 | goto continue_unlock; | 277 | goto continue_unlock; |
278 | 278 | ||
279 | if (f2fs_write_meta_page(page, &wbc)) { | 279 | if (mapping->a_ops->writepage(page, &wbc)) { |
280 | unlock_page(page); | 280 | unlock_page(page); |
281 | break; | 281 | break; |
282 | } | 282 | } |
@@ -464,20 +464,19 @@ static void recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) | |||
464 | 464 | ||
465 | void recover_orphan_inodes(struct f2fs_sb_info *sbi) | 465 | void recover_orphan_inodes(struct f2fs_sb_info *sbi) |
466 | { | 466 | { |
467 | block_t start_blk, orphan_blkaddr, i, j; | 467 | block_t start_blk, orphan_blocks, i, j; |
468 | 468 | ||
469 | if (!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ORPHAN_PRESENT_FLAG)) | 469 | if (!is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ORPHAN_PRESENT_FLAG)) |
470 | return; | 470 | return; |
471 | 471 | ||
472 | set_sbi_flag(sbi, SBI_POR_DOING); | 472 | set_sbi_flag(sbi, SBI_POR_DOING); |
473 | 473 | ||
474 | start_blk = __start_cp_addr(sbi) + 1 + | 474 | start_blk = __start_cp_addr(sbi) + 1 + __cp_payload(sbi); |
475 | le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload); | 475 | orphan_blocks = __start_sum_addr(sbi) - 1 - __cp_payload(sbi); |
476 | orphan_blkaddr = __start_sum_addr(sbi) - 1; | ||
477 | 476 | ||
478 | ra_meta_pages(sbi, start_blk, orphan_blkaddr, META_CP); | 477 | ra_meta_pages(sbi, start_blk, orphan_blocks, META_CP); |
479 | 478 | ||
480 | for (i = 0; i < orphan_blkaddr; i++) { | 479 | for (i = 0; i < orphan_blocks; i++) { |
481 | struct page *page = get_meta_page(sbi, start_blk + i); | 480 | struct page *page = get_meta_page(sbi, start_blk + i); |
482 | struct f2fs_orphan_block *orphan_blk; | 481 | struct f2fs_orphan_block *orphan_blk; |
483 | 482 | ||
@@ -615,7 +614,7 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi) | |||
615 | unsigned long blk_size = sbi->blocksize; | 614 | unsigned long blk_size = sbi->blocksize; |
616 | unsigned long long cp1_version = 0, cp2_version = 0; | 615 | unsigned long long cp1_version = 0, cp2_version = 0; |
617 | unsigned long long cp_start_blk_no; | 616 | unsigned long long cp_start_blk_no; |
618 | unsigned int cp_blks = 1 + le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload); | 617 | unsigned int cp_blks = 1 + __cp_payload(sbi); |
619 | block_t cp_blk_no; | 618 | block_t cp_blk_no; |
620 | int i; | 619 | int i; |
621 | 620 | ||
@@ -796,6 +795,7 @@ retry: | |||
796 | * wribacking dentry pages in the freeing inode. | 795 | * wribacking dentry pages in the freeing inode. |
797 | */ | 796 | */ |
798 | f2fs_submit_merged_bio(sbi, DATA, WRITE); | 797 | f2fs_submit_merged_bio(sbi, DATA, WRITE); |
798 | cond_resched(); | ||
799 | } | 799 | } |
800 | goto retry; | 800 | goto retry; |
801 | } | 801 | } |
@@ -884,7 +884,7 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
884 | __u32 crc32 = 0; | 884 | __u32 crc32 = 0; |
885 | void *kaddr; | 885 | void *kaddr; |
886 | int i; | 886 | int i; |
887 | int cp_payload_blks = le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload); | 887 | int cp_payload_blks = __cp_payload(sbi); |
888 | 888 | ||
889 | /* | 889 | /* |
890 | * This avoids to conduct wrong roll-forward operations and uses | 890 | * This avoids to conduct wrong roll-forward operations and uses |
@@ -1048,17 +1048,18 @@ void write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1048 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); | 1048 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); |
1049 | unsigned long long ckpt_ver; | 1049 | unsigned long long ckpt_ver; |
1050 | 1050 | ||
1051 | trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "start block_ops"); | ||
1052 | |||
1053 | mutex_lock(&sbi->cp_mutex); | 1051 | mutex_lock(&sbi->cp_mutex); |
1054 | 1052 | ||
1055 | if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) && | 1053 | if (!is_sbi_flag_set(sbi, SBI_IS_DIRTY) && |
1056 | cpc->reason != CP_DISCARD && cpc->reason != CP_UMOUNT) | 1054 | (cpc->reason == CP_FASTBOOT || cpc->reason == CP_SYNC)) |
1057 | goto out; | 1055 | goto out; |
1058 | if (unlikely(f2fs_cp_error(sbi))) | 1056 | if (unlikely(f2fs_cp_error(sbi))) |
1059 | goto out; | 1057 | goto out; |
1060 | if (f2fs_readonly(sbi->sb)) | 1058 | if (f2fs_readonly(sbi->sb)) |
1061 | goto out; | 1059 | goto out; |
1060 | |||
1061 | trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "start block_ops"); | ||
1062 | |||
1062 | if (block_operations(sbi)) | 1063 | if (block_operations(sbi)) |
1063 | goto out; | 1064 | goto out; |
1064 | 1065 | ||
@@ -1085,6 +1086,10 @@ void write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1085 | 1086 | ||
1086 | unblock_operations(sbi); | 1087 | unblock_operations(sbi); |
1087 | stat_inc_cp_count(sbi->stat_info); | 1088 | stat_inc_cp_count(sbi->stat_info); |
1089 | |||
1090 | if (cpc->reason == CP_RECOVERY) | ||
1091 | f2fs_msg(sbi->sb, KERN_NOTICE, | ||
1092 | "checkpoint: version = %llx", ckpt_ver); | ||
1088 | out: | 1093 | out: |
1089 | mutex_unlock(&sbi->cp_mutex); | 1094 | mutex_unlock(&sbi->cp_mutex); |
1090 | trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint"); | 1095 | trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint"); |
@@ -1103,14 +1108,9 @@ void init_ino_entry_info(struct f2fs_sb_info *sbi) | |||
1103 | im->ino_num = 0; | 1108 | im->ino_num = 0; |
1104 | } | 1109 | } |
1105 | 1110 | ||
1106 | /* | ||
1107 | * considering 512 blocks in a segment 8 blocks are needed for cp | ||
1108 | * and log segment summaries. Remaining blocks are used to keep | ||
1109 | * orphan entries with the limitation one reserved segment | ||
1110 | * for cp pack we can have max 1020*504 orphan entries | ||
1111 | */ | ||
1112 | sbi->max_orphans = (sbi->blocks_per_seg - F2FS_CP_PACKS - | 1111 | sbi->max_orphans = (sbi->blocks_per_seg - F2FS_CP_PACKS - |
1113 | NR_CURSEG_TYPE) * F2FS_ORPHANS_PER_BLOCK; | 1112 | NR_CURSEG_TYPE - __cp_payload(sbi)) * |
1113 | F2FS_ORPHANS_PER_BLOCK; | ||
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | int __init create_checkpoint_caches(void) | 1116 | int __init create_checkpoint_caches(void) |