日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

f2fs学习笔记 - 6. f2fs初始化流程

發布時間:2023/12/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 f2fs学习笔记 - 6. f2fs初始化流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.前言

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

2. init_f2fs_fs

  • init_inodecache
    創建f2fs_inode_cache slab描述符
  • create_node_manager_caches
    創建nat_entry,free_nid的slab描述符
  • create_gc_caches
    創建f2fs_gc_inodes的 slab描述符
  • create_checkpoint_caches
    創建f2fs_orphan_entry,f2fs_dirty_dir_entry的slab描述符
  • register_filesystem
    注冊f2fs文件系統
  • 3. f2fs_fill_super

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

    f2fs_fill_super主要包含如下幾個步驟:

  • 從磁盤讀取raw super block;
  • 初始化vfs的super block;
  • 初始化f2fs的super block info, 通過sb與vfs的super block關聯;
  • 讀取有效的cp block
  • 創建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
  • 為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

  • kzalloc(sizeof(struct f2fs_sb_info), GFP_KERNEL)
    為f2fs_sb_info分配空間
  • sb_set_blocksize(sb, F2FS_BLKSIZE)
    block大小設置為4096
  • sb_bread(sb, 0)
    讀取磁盤上的super_block
  • 初始化一些super block info變量
    (1)active_logs
    (2) 設置mount參數為EXT2_MOUNT_BG_GC
    (3)parse_options:解析 mount 參數
    (4) 初始化sb->s_op = &f2fs_sops
  • sanity_check_raw_super
    檢查super block的參數
  • 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)
  • get_valid_checkpoint
    獲取cp
  • sanity_check_ckpt(raw_super, sbi->ckpt)
    檢測cp
  • init super block
    sb_set_blocksize
  • 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初始化流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。