1.前言
本文主要记录checkpoint的过程
2.checkpoint的时机
1.gc: 当空闲segment 不足的时候,可以通过check point 释放。
2.sync:执行sync操作时
3.super_block: super block 的put_super 接口需要通过f2fs_write_checkpoint() 来把没有来得及umount导致的可能不一致的数据重新做一次check point。
3.checkpoint的流程
f2fs_sync_fs
write_checkpoint(sbi, false, false)
block_operations(sbi)
f2fs_submit_bio
flush_nat_entries(sbi)
flush_sit_entries(sbi)
reset_victim_segmap(sbi)
do_checkpoint(sbi, is_umount)
sync_meta_pages(sbi, META, LONG_MAX)
write_checkpoint同步元数据,包括cp区域,SIT区域,NAT区域
-
block_operations(sbi):为执行checkpoint冻结FS操作
-
f2fs_submit_bio(sbi, DATA, true):提交data的io给block层,同步
f2fs_submit_bio(sbi, NODE, true): 提交node的io给block层,同步
f2fs_submit_bio(sbi, META, true): 提交meta的io给block层,同步 -
flush_nat_entries(sbi):flush dirty的nat entry,如果current segment的summary有空间则更新到此,否则更新到nat区
flush_sit_entries(sbi):flush dirty的sit entry,如果current segment的summary有空间则更新到此,否则更新到sit区
注:flush_nat_entries和flush_sit_entries都是将dirty数据flush到page cache,通过do_checkpoint才能真正执行submit_bio实现落盘。 -
reset_victim_segmap(sbi):
-
do_checkpoint
(1)sync_meta_pages:将page cache中NAT和SIT page落盘
(2)写入cp, orphan node, data summary, node summary -
unblock_operations: 解冻FS操作