f2fs系列文章fill_super(一)

    这个系列文章将讲述文件系统的安装过程,以函数f2fs_fill_super为起点。

    f2fs_fill_super:通过调用sb_set_blocksize来检查和设置super_block的块大小字段和快设备的块大小。然后调用read_raw_super_block来对物理设备上的f2fs_super_block进行读取。接下来就可以对f2fs_sb_info的某些字段进行初始化了。init_sb_info函数用刚才读取的f2fs_super_block对f2fs_sb_info进行初始化。init_percpu_info对sbi的几个统计的数据进行了per cpu的初始化。然后是对f2fs_sb_info的meta_inode进行赋值,这个字段是f2fs用来管理元数据page cache的inode,所以它在磁盘上面起始时没有具体的存在形式的,所以这里的初始化通过调用函数f2fs_iget仅仅inode->i_mapping->a_ops =&f2fs_meta_aops对相应的aops赋值了。接下来就是通过get_valid_checkpoint读取最新版本的f2fs_checkpoint。接着利用读取的f2fs_checkpoint对f2fs_sb_info再次进行某些字段的初始化。然后对管理文件系统脏的inode的链表inode_list和相关锁inode_lock进行初始化。这里的链表的个数是NR_INODE_TYPE,分别对应DIR_INODE/FILE_INODE/DIRTY_META三种类型。接下来调用函数init_extent_cache_info来完成管理extent信息的结构。然后函数init_ino_entry_info初始化ino_management的信息和最大孤儿节点个数的信息。接着调用build_segment_manager构造文件系统在内存中的segment的管理结构f2fs_sm_info。然后调用build_node_manager构造文件系统在内存中的node的管理结构f2fs_nm_info。接着调用build_gc_manager来初始化gc_manager,主要是确定select_victim的函数。然后是对f2fs_sb_info的node_inode进行赋值,同meta_inode,磁盘上没有具体的存在形式,所以只是对aops的赋值。然后调用f2fs_join_shrinker将新安装的文件系统的实例加入到f2fs这种文件系统的链表中。接着调用recover_orphan_inodes来将orphan inode中的所有的inode全部删除掉。接着调用函数f2fs_iget来读取root inode,然后d_make_root来构造root inode的目录项。f2fs_build_stats 来构造统计信息f2fs_stat_info。接着检查手否设置标志DISABLE_ROLL_FORWARD来决定是否进行前滚操作,这个都是通过函数recover_fsync_data来完成的。如果设置了BG_GC并且文件系统不是只读的,那么就调用start_gc_thread来启动gc线程。最后根据前面读取f2fs_super_block是否有问题来决定是否调用函数f2fs_commit_super来修复f2fs_super_block。最后更新f2fs_sb_info的CP_TIME和REQ_TIME时间。

static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
{
	struct f2fs_sb_info *sbi;
	struct f2fs_super_block *raw_super;
	struct inode *root;
	int err;
	bool retry = true, need_fsck = false;
	char *options = NULL;
	int recovery, i, valid_super_block;
	struct
f2fs文件系统调用主要涉及以下几个组件和函数: 1. 文件系统类型定义:在f2fs文件系统中,通过定义个file_system_type结构体来表示文件系统类型。其中包括了文件系统的名称、挂载函数、卸载函数等信息。在f2fs中,文件系统类型定义如下: static struct file_system_type f2fs_fs_type = { .owner = THIS_MODULE, .name = "f2fs", .mount = f2fs_mount, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; 2. 挂载函数:f2fs_mount函数是用来将块设备挂载成f2fs文件系统的函数。它是通过调用mount_bdev函数来实现的。具体的挂载过程包括了填充f2fs super block信息等操作。在f2fs中,挂载函数定义如下: static struct dentry *f2fs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return mount_bdev(fs_type, flags, dev_name, data, f2fs_fill_super); } 3. 填充super block信息:f2fs_fill_super函数用来填充f2fs文件系统的super block信息。它会读取块设备上的super block数据,并将其解析为内存中的数据结构。在f2fs中,填充super block信息的函数定义如下: static int f2fs_fill_super(struct super_block *sb, void *data, int silent) { // 填充super block信息的具体实现 } 通过以上组件和函数,f2fs文件系统可以被调用和使用。当用户在用户空间执行mount操作时,会回调到文件系统类型中定义的mount函数,即f2fs_mount函数。在f2fs_mount函数中,会调用mount_bdev函数来实现具体的挂载过程,包括填充super block信息等操作。最终,f2fs文件系统就可以被成功挂载和使用。 #### 引用[.reference_title] - *1* [f2fs学习笔记 - 4. f2fs文件系统组件说明](https://blog.youkuaiyun.com/jasonactions/article/details/122417105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [f2fs学习四: f2fs文件系统挂载](https://blog.youkuaiyun.com/guozhidixian/article/details/115498708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值