Commit 75ab4cb8301adb3a02a96c5c03c837ed941f1bc5
1 parent
95dd897301
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
f2fs: introduce cp_control structure
This patch add a new data structure to control checkpoint parameters. Currently, it presents the reason of checkpoint such as is_umount and normal sync. Reviewed-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Showing 6 changed files with 47 additions and 20 deletions Side-by-side Diff
fs/f2fs/checkpoint.c
... | ... | @@ -826,7 +826,7 @@ |
826 | 826 | finish_wait(&sbi->cp_wait, &wait); |
827 | 827 | } |
828 | 828 | |
829 | -static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount) | |
829 | +static void do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |
830 | 830 | { |
831 | 831 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); |
832 | 832 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE); |
... | ... | @@ -894,7 +894,7 @@ |
894 | 894 | ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks + |
895 | 895 | orphan_blocks); |
896 | 896 | |
897 | - if (is_umount) { | |
897 | + if (cpc->reason == CP_UMOUNT) { | |
898 | 898 | set_ckpt_flags(ckpt, CP_UMOUNT_FLAG); |
899 | 899 | ckpt->cp_pack_total_block_count = cpu_to_le32(F2FS_CP_PACKS+ |
900 | 900 | cp_payload_blks + data_sum_blocks + |
... | ... | @@ -948,7 +948,7 @@ |
948 | 948 | |
949 | 949 | write_data_summaries(sbi, start_blk); |
950 | 950 | start_blk += data_sum_blocks; |
951 | - if (is_umount) { | |
951 | + if (cpc->reason == CP_UMOUNT) { | |
952 | 952 | write_node_summaries(sbi, start_blk); |
953 | 953 | start_blk += NR_CURSEG_NODE_TYPE; |
954 | 954 | } |
955 | 955 | |
... | ... | @@ -988,12 +988,12 @@ |
988 | 988 | /* |
989 | 989 | * We guarantee that this checkpoint procedure will not fail. |
990 | 990 | */ |
991 | -void write_checkpoint(struct f2fs_sb_info *sbi, bool is_umount) | |
991 | +void write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |
992 | 992 | { |
993 | 993 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); |
994 | 994 | unsigned long long ckpt_ver; |
995 | 995 | |
996 | - trace_f2fs_write_checkpoint(sbi->sb, is_umount, "start block_ops"); | |
996 | + trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "start block_ops"); | |
997 | 997 | |
998 | 998 | mutex_lock(&sbi->cp_mutex); |
999 | 999 | |
... | ... | @@ -1004,7 +1004,7 @@ |
1004 | 1004 | if (block_operations(sbi)) |
1005 | 1005 | goto out; |
1006 | 1006 | |
1007 | - trace_f2fs_write_checkpoint(sbi->sb, is_umount, "finish block_ops"); | |
1007 | + trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish block_ops"); | |
1008 | 1008 | |
1009 | 1009 | f2fs_submit_merged_bio(sbi, DATA, WRITE); |
1010 | 1010 | f2fs_submit_merged_bio(sbi, NODE, WRITE); |
1011 | 1011 | |
... | ... | @@ -1023,13 +1023,13 @@ |
1023 | 1023 | flush_sit_entries(sbi); |
1024 | 1024 | |
1025 | 1025 | /* unlock all the fs_lock[] in do_checkpoint() */ |
1026 | - do_checkpoint(sbi, is_umount); | |
1026 | + do_checkpoint(sbi, cpc); | |
1027 | 1027 | |
1028 | 1028 | unblock_operations(sbi); |
1029 | 1029 | stat_inc_cp_count(sbi->stat_info); |
1030 | 1030 | out: |
1031 | 1031 | mutex_unlock(&sbi->cp_mutex); |
1032 | - trace_f2fs_write_checkpoint(sbi->sb, is_umount, "finish checkpoint"); | |
1032 | + trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint"); | |
1033 | 1033 | } |
1034 | 1034 | |
1035 | 1035 | void init_ino_entry_info(struct f2fs_sb_info *sbi) |
fs/f2fs/f2fs.h
... | ... | @@ -96,6 +96,15 @@ |
96 | 96 | SIT_BITMAP |
97 | 97 | }; |
98 | 98 | |
99 | +enum { | |
100 | + CP_UMOUNT, | |
101 | + CP_SYNC, | |
102 | +}; | |
103 | + | |
104 | +struct cp_control { | |
105 | + int reason; | |
106 | +}; | |
107 | + | |
99 | 108 | /* |
100 | 109 | * For CP/NAT/SIT/SSA readahead |
101 | 110 | */ |
... | ... | @@ -1314,7 +1323,7 @@ |
1314 | 1323 | void add_dirty_dir_inode(struct inode *); |
1315 | 1324 | void remove_dirty_dir_inode(struct inode *); |
1316 | 1325 | void sync_dirty_dir_inodes(struct f2fs_sb_info *); |
1317 | -void write_checkpoint(struct f2fs_sb_info *, bool); | |
1326 | +void write_checkpoint(struct f2fs_sb_info *, struct cp_control *); | |
1318 | 1327 | void init_ino_entry_info(struct f2fs_sb_info *); |
1319 | 1328 | int __init create_checkpoint_caches(void); |
1320 | 1329 | void destroy_checkpoint_caches(void); |
fs/f2fs/gc.c
... | ... | @@ -694,6 +694,9 @@ |
694 | 694 | int gc_type = BG_GC; |
695 | 695 | int nfree = 0; |
696 | 696 | int ret = -1; |
697 | + struct cp_control cpc = { | |
698 | + .reason = CP_SYNC, | |
699 | + }; | |
697 | 700 | |
698 | 701 | INIT_LIST_HEAD(&ilist); |
699 | 702 | gc_more: |
... | ... | @@ -704,7 +707,7 @@ |
704 | 707 | |
705 | 708 | if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) { |
706 | 709 | gc_type = FG_GC; |
707 | - write_checkpoint(sbi, false); | |
710 | + write_checkpoint(sbi, &cpc); | |
708 | 711 | } |
709 | 712 | |
710 | 713 | if (!__get_victim(sbi, &segno, gc_type, NO_CHECK_TYPE)) |
... | ... | @@ -729,7 +732,7 @@ |
729 | 732 | goto gc_more; |
730 | 733 | |
731 | 734 | if (gc_type == FG_GC) |
732 | - write_checkpoint(sbi, false); | |
735 | + write_checkpoint(sbi, &cpc); | |
733 | 736 | stop: |
734 | 737 | mutex_unlock(&sbi->gc_mutex); |
735 | 738 |
fs/f2fs/recovery.c
... | ... | @@ -542,8 +542,11 @@ |
542 | 542 | set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG); |
543 | 543 | mutex_unlock(&sbi->cp_mutex); |
544 | 544 | } else if (need_writecp) { |
545 | + struct cp_control cpc = { | |
546 | + .reason = CP_SYNC, | |
547 | + }; | |
545 | 548 | mutex_unlock(&sbi->cp_mutex); |
546 | - write_checkpoint(sbi, false); | |
549 | + write_checkpoint(sbi, &cpc); | |
547 | 550 | } else { |
548 | 551 | mutex_unlock(&sbi->cp_mutex); |
549 | 552 | } |
fs/f2fs/super.c
... | ... | @@ -434,8 +434,12 @@ |
434 | 434 | stop_gc_thread(sbi); |
435 | 435 | |
436 | 436 | /* We don't need to do checkpoint when it's clean */ |
437 | - if (sbi->s_dirty) | |
438 | - write_checkpoint(sbi, true); | |
437 | + if (sbi->s_dirty) { | |
438 | + struct cp_control cpc = { | |
439 | + .reason = CP_UMOUNT, | |
440 | + }; | |
441 | + write_checkpoint(sbi, &cpc); | |
442 | + } | |
439 | 443 | |
440 | 444 | /* |
441 | 445 | * normally superblock is clean, so we need to release this. |
442 | 446 | |
... | ... | @@ -466,8 +470,11 @@ |
466 | 470 | trace_f2fs_sync_fs(sb, sync); |
467 | 471 | |
468 | 472 | if (sync) { |
473 | + struct cp_control cpc = { | |
474 | + .reason = CP_SYNC, | |
475 | + }; | |
469 | 476 | mutex_lock(&sbi->gc_mutex); |
470 | - write_checkpoint(sbi, false); | |
477 | + write_checkpoint(sbi, &cpc); | |
471 | 478 | mutex_unlock(&sbi->gc_mutex); |
472 | 479 | } else { |
473 | 480 | f2fs_balance_fs(sbi); |
include/trace/events/f2fs.h
... | ... | @@ -69,6 +69,11 @@ |
69 | 69 | { GC_GREEDY, "Greedy" }, \ |
70 | 70 | { GC_CB, "Cost-Benefit" }) |
71 | 71 | |
72 | +#define show_cpreason(type) \ | |
73 | + __print_symbolic(type, \ | |
74 | + { CP_UMOUNT, "Umount" }, \ | |
75 | + { CP_SYNC, "Sync" }) | |
76 | + | |
72 | 77 | struct victim_sel_policy; |
73 | 78 | |
74 | 79 | DECLARE_EVENT_CLASS(f2fs__inode, |
75 | 80 | |
76 | 81 | |
77 | 82 | |
78 | 83 | |
... | ... | @@ -944,25 +949,25 @@ |
944 | 949 | |
945 | 950 | TRACE_EVENT(f2fs_write_checkpoint, |
946 | 951 | |
947 | - TP_PROTO(struct super_block *sb, bool is_umount, char *msg), | |
952 | + TP_PROTO(struct super_block *sb, int reason, char *msg), | |
948 | 953 | |
949 | - TP_ARGS(sb, is_umount, msg), | |
954 | + TP_ARGS(sb, reason, msg), | |
950 | 955 | |
951 | 956 | TP_STRUCT__entry( |
952 | 957 | __field(dev_t, dev) |
953 | - __field(bool, is_umount) | |
958 | + __field(int, reason) | |
954 | 959 | __field(char *, msg) |
955 | 960 | ), |
956 | 961 | |
957 | 962 | TP_fast_assign( |
958 | 963 | __entry->dev = sb->s_dev; |
959 | - __entry->is_umount = is_umount; | |
964 | + __entry->reason = reason; | |
960 | 965 | __entry->msg = msg; |
961 | 966 | ), |
962 | 967 | |
963 | 968 | TP_printk("dev = (%d,%d), checkpoint for %s, state = %s", |
964 | 969 | show_dev(__entry), |
965 | - __entry->is_umount ? "clean umount" : "consistency", | |
970 | + show_cpreason(__entry->reason), | |
966 | 971 | __entry->msg) |
967 | 972 | ); |
968 | 973 |