1.前言

初始流程主要包含f2fs文件系统初始化,以及f2fs文件系统mount

2. init_f2fs_fs

  1. init_inodecache
    创建f2fs_inode_cache slab描述符
  2. create_node_manager_caches
    创建nat_entry,free_nid的slab描述符
  3. create_gc_caches
    创建f2fs_gc_inodes的 slab描述符
  4. create_checkpoint_caches
    创建f2fs_orphan_entry,f2fs_dirty_dir_entry的slab描述符
  5. register_filesystem
    注册f2fs文件系统

3. f2fs_fill_super

f2fs_mount|--mount_bdev|--blkdev_get_by_path|--sget|--f2fs_fill_super

f2fs_fill_super主要包含如下几个步骤:

  1. 从磁盘读取raw super block;
  2. 初始化vfs的super block;
  3. 初始化f2fs的super block info, 通过sb与vfs的super block关联;
  4. 读取有效的cp block
  5. 创建f2fs内部模块,包括segment manager, node manager, gc manager
    (1)构建segment manager
    构建main area info, sit info, cp info, ssa info
    为main area构建free segment信息
    为main area构建current segment信息,包含6个current segment
    为main area创建sit entries
    (2)构建node manager
    (3)构建gc manager
  6. 为meta_inode, node, root分别创建inode,通过d_make_root创建根dentry
    7.如果是非正常卸载!(sbi->ckpt->ckpt_flags & CP_UMOUNT_FLAG),则需要recover_fsync_data执行磁盘恢复
    8.执行start_gc_thread

3.1 从磁盘读取raw super block

  1. kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL)
    为f2fs_sb_info分配空间
  2. sb_set_blocksize(sb, F2FS_BLKSIZE)
    block大小设置为4096
  3. sb_bread(sb, 0)
    读取磁盘上的super_block
  4. 初始化一些super block info变量
    (1)active_logs
    (2) 设置mount参数为EXT2_MOUNT_BG_GC
    (3)parse_options:解析 mount 参数
    (4) 初始化sb->s_op = &f2fs_sops
  5. sanity_check_raw_super
    检查super block的参数
  6. sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi))
    获取一个inode给meta inode
    (1)iget_locked(sb, ino)获取一个inode
    (2) inode->i_mapping->a_ops = &f2fs_meta_aops
    通过inode的针对不同的inode类型,给不同的inode->i_mapping->a_ops初始化。
    主要分为:node, meta, regular, dir, slink, char
    meta data则被初始化为f2fs_meta_aops
    (3)mapping_set_gfp_mask(inode->i_mapping, GFP_F2FS_ZERO)
  7. get_valid_checkpoint
    获取cp
  8. sanity_check_ckpt(raw_super, sbi->ckpt)
    检测cp
  9. init super block
    sb_set_blocksize
  10. init_orphan_info
    INIT_LIST_HEAD(&sbi->orphan_inode_list);
    sbi->n_orphans = 0

3.2 build_segment_manager(sbi)

  • 初始化segment manager info
    sm_info->seg0_blkaddr:cp区域的第0个block的地址
    sm_info->main_blkaddr:main area的 block地址
    sm_info->segment_count:始化segment count的数目, 它不包含sb所占用的segment
    sm_info->reserved_segments:main区域中保留的segment的个数
    sm_info->ovp_segments:main区域中over provision的segment的个数
    sm_info->main_segments:main区域的segment的个数
  • build_sit_info
    最重要的是为每个segment创建描述符segment entry, seg_entry记录了一个segment的有效块数,有效块的bitmap等信息 ,为main area分配dirty segment entry bitmap空间,为main area的所有segment分配valid block bitmap
  • build_free_segmap
    构建free_segmap_info, 最主要的是构建了free bit map
  • build_curseg
    当前有效的segment创建summary block, 并通过cp区域存放的当前有效segment summary block初始化,由于镜像采用了compacted summaries,因此将nat journal存放到current hot data的summary block, 将sit journal存放到current cold data的summary block
  • build_sit_entries
    始化内存中的sit entries,如果segment在sit jornal entry中没有对应的seg entry,则需要从磁盘的sit区域获取, 如果有则直接用以初始化内存中的sit entry, 此处也会
  • init_free_segmap
    根据main area的segment是否有valid block,初始化free segmap, 清零/置位free_segmap_info->free_segmap
  • build_dirty_segmap
    基于free_segmap_info初始化dirty_seglist_info,因为free_segmap_info中bitmap中bit为1表示dirty

3.3 build_node_manager

初始化node manager info, 重点初始化了nat_bitmap, 它来源于cp

3.4 build_gc_manager

get_victim_by_default

3.5 recover_fsync_data

TODO

3.6 start_gc_thread

TODO

f2fs学习笔记 - 6. f2fs初始化流程相关推荐

  1. f2fs学习笔记 - 7. f2fs文件打开

    1. 前言 本文主要总结f2fs文件的打开过程,以touch test为例 2.打开文件总体流程 在打开文件时,获取了file描述符,创建了file, 而file->op_s来源于file所对应 ...

  2. f2fs学习笔记 -11. f2fs gc

    1.前言 GC分为前台GC和后台GC 2.总体流程 f2fs_fill_superstart_gc_thread(sbi)init_waitqueue_head(&sbi->gc_thr ...

  3. f2fs学习笔记 - 2. f2fs基础实验环境搭建

    1.前言 本文主要记录如何搭建f2fs的环境,用于f2fs文件系统的学习.我们选用了f2fs第一个补丁提交前的内核版本:linux3.7.0.然后通过提取出f2fs的最小补丁来学习f2fs文件系统,这 ...

  4. f2fs学习笔记 -10. f2fs fsync

    kernel:linux3.17 fs: f2fs初始版本 1.前言 本文主要记录f2fs fsync的流程. 2.总体流程 do_fsyncfget(fd)vfs_fsync(file, file- ...

  5. f2fs学习笔记 - 5. f2fs基本类图

    f2fs_nat_entry f2fs node address table entry, 可以认为是main area区域的node block的描述符.version? ino为node所对应的i ...

  6. PCIe学习笔记之pcie初始化枚举和资源分配流程代码分析

    本文主要是对PCIe的初始化枚举.资源分配流程进行分析.代码对应的是linux 4.19, 平台是arm64. 文章首发于这里 1. PCIe architecture 1.1 pcie的拓扑结构 在 ...

  7. IMX6ULL学习笔记(四) —— uboot 启动流程

    IMX6ULL 学习笔记 version : v1.0 「2023.4.27」 author: Y.Z.T. 摘要: 随记, 记录 I.MX6ULL 系列 SOC 的uboot 启动流程 ⭐️ 目录 ...

  8. 学习笔记之centos系统启动流程

     CentOS 系统的启动流程: 简介: (内核级别)POST -读取-> BootSequence(在BIOS中) --> BootLoader(在MBR中)--> Kernel( ...

  9. requirejs的源码学习(01)——初始化流程

    目录 前言 程序入口 requirejs初始化流程简述 一些重要的函数的解析 前言 现在已经2022年了,大家都已经用上webpack来进行各种打包了,webpack也能很好的兼容各种模块化方案,但是 ...

最新文章

  1. 《C++程序设计POJ》《WEEK7 输入输出和模板》《流操纵算子》《文件读写》《二进制文件读写》...
  2. 一分钟详解PCL中点云配准技术
  3. 监听localStorage变化(同页面监听)
  4. Java EE 6测试第I部分– EJB 3.1可嵌入API
  5. 汇编语言-010(循环移位ROL,ROR 、进位循环进位RCL,RCR 、有符号数溢出 、双精度移位SHLD,SHRD、SHL和ADD计算 、位运算应用)
  6. 数据中心网络架构的问题与演进 — 传统路由交换技术与三层网络架构
  7. 修改固态硬盘的物理序列号_买固态怕踩坑?收下这些软件,轻松鉴别好坏
  8. 网络虚拟化有几种实现方式_机械零件表面实现镜面的几种加工方式
  9. r语言之散点图类型type参数
  10. mysql sycho_2005年12月23日
  11. 屏幕分辨率修改工具SwitchResX for Mac
  12. 【ES实战】ES-Hadoop中的配置项说明
  13. 过程装备安装调试技术实训装置QY-GCKZ04
  14. CodeMirror使用说明书
  15. 【C语言自学】第三章流程控制
  16. 达威尔液晶电子手写板儿童涂鸦画板写字板,培养小孩创造力和想象力的好工具!
  17. Sentinel-哨兵机制
  18. spyder怎么执行html文件,spyder添加快捷键
  19. go语言视频教程_ go语言入门视频教程_go语言实战视频教程
  20. eSIM产业动态(持续更新)

热门文章

  1. 一缕黑暗中的火光-----------协作图--------------优雅的建模语言
  2. Unity 游戏存档框架实现
  3. 计算圆的周长、面积、球 的体积
  4. 电邮地址_电子邮件如何运作?
  5. 闪动的TextView
  6. php常见后门,php后门隐藏技巧大全
  7. 火车头采集翻页内容_火车头采集器教程:使用分页采集有分页的数据
  8. TortoiseSVN安装最新版,设置中文;并修改比对工具为BeyondCompare
  9. HTML页面限制与禁止
  10. Swagger如何屏蔽某些接口显示