1.前言
GC分为前台GC和后台GC
2.总体流程
f2fs_fill_super
start_gc_thread(sbi)
init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head)
kthread_run(gc_thread_func)
3.gc_thread_func
gc_thread_func
f2fs_balance_fs(sbi)
sync_dirty_dir_inodes
sync_node_pages
f2fs_gc
__get_victim
do_garbage_collect
-
f2fs_balance_fs
如果need_to_flush为true,将执行sync_dirty_dir_inodes来写入dirty directory inode
sync_node_pages来写入dirty node page -
f2fs_gc
如果has_not_enough_free_secs为false则执行f2fs_gc操作, 它实际会执行__get_victim,实际回调为get_victim_by_default,最终通过get_victim_by_default选择出合适的section, 通过对section中的每个segment执行do_garbage_collect进行GC回收。do_garbage_collect分为两种回收,gc_node_segment和gc_data_segment。
参考文档
1.https://blog.csdn.net/u011649400/article/details/100530006
F2FS源码分析-4.1 [F2FS GC部分] 垃圾回收机制源码分析
2.https://github.com/RiweiPan/F2FS-NOTES/blob/master/ImportantDataStructure/f2fs_summary.md
f2fs_summary 和 f2fs_summary_block