1. 前言

本文主要总结f2fs文件的打开过程,以touch test为例

2.打开文件总体流程

在打开文件时,获取了file描述符,创建了file, 而file->op_s来源于file所对应的inode->i_fop
而inode是如何被创建的呢?

[<7f003770>] (f2fs_create+0x24/0x1fc [f2fs]) from [<800c1724>] (vfs_create+0x80/0xb4)
[<800c1724>] (vfs_create+0x80/0xb4) from [<800c462c>] (do_last.isra.45+0x794/0xb98)
[<800c462c>] (do_last.isra.45+0x794/0xb98) from [<800c4ad8>] (path_openat+0xa8/0x47c)
[<800c4ad8>] (path_openat+0xa8/0x47c) from [<800c5170>] (do_filp_open+0x2c/0x80)
[<800c5170>] (do_filp_open+0x2c/0x80) from [<800b6f40>] (do_sys_open+0xe4/0x170)
[<800b6f40>] (do_sys_open+0xe4/0x170) from [<8000e140>] (ret_fast_syscall+0x0/0x30)

打开文件的过程中,会调用vfs_create,vfs_create会调用具体文件系统的create回调,对于f2fs文件系统就是通过f2fs_create来创建了inode, 并对inode进行初始化,其中:
inode->i_fop = &f2fs_file_operations; f2fs_file_operations定义在f2fs/file.c中

之后将通过如下的调用来将inode->i_fop赋值给file->f_op,如果file->f_op->open不为空,则将得到执行

do_lastfinish_opendo_dentry_open

3. f2fs_create

通过f2fs_create创建了inode,同时初始化如下的操作函数集:

138         inode->i_op = &f2fs_file_inode_operations;
139         inode->i_fop = &f2fs_file_operations;
140         inode->i_mapping->a_ops = &f2fs_dblock_aops;

f2fs_file_operations将用来初始化file->f_op
f2fs_dblock_aops主要用于与page cache的交互相关

3. mknod

字符设备文件的创建

mknod系统调用->vfs_mknod->dir->i_op->mknod(dir, dentry, mode, dev)->f2fs_mknod (struct inode * dir, struct dentry *dentry,int mode, dev_t rdev)->f2fs_new_inodeinit_special_inode

字符设备文件与块设备文件创建的流程基本是一致的,都是通过mknod系统调用。以f2fs为例它通过调用f2fs_mknod。首先通过f2fs_new_inode来创建inode

  1. f2fs_new_inode:创建新的inode

  2. init_special_inode
    为新创建的inode进行初始化,其中针对字符设备会指定inode->i_fop为def_chr_fops,它会在文件打开的时候赋值给新创建的file->f_ops,并调用其中的chrdev_open

4. 字符设备文件的打开

参考打开文件的流程,对于字符设备file->fops为def_chr_fops,它的open函数为chrdev_open
因此将按如下路程执行:

do_lastfinish_opendo_dentry_openchrdev_open

5. 块设备文件的创建

mknod系统调用->vfs_mknod->dir->i_op->mknod(dir, dentry, mode, dev)->f2fs_mknod (struct inode * dir, struct dentry *dentry,int mode, dev_t rdev)->f2fs_new_inodeinit_special_inode

块设备文件创建与字符设备文件创建的流程基本是一致的,都是通过mknod系统调用。以f2fs为例它通过调用f2fs_mknod。首先通过f2fs_new_inode来创建次inode,这其中也包含了f2fs自己的inode,之后对次inode执行初始化,其中初始化次inode->f_ops为def_blk_fops

  1. f2fs_new_inode:创建新的inode,这个就是次inode,次inode的内容就是设备号,并没有占用额外的磁盘空间,将来次inode就是通过设备号建立了与block_inode的关联;

  2. init_special_inode:为新创建的次inode进行初始化,其中针对块设备会指定inode->i_fop为def_blk_fops

5. 块设备文件的打开

参考打开文件的流程,对于块设备file->fops为def_blk_fops,它的open函数为blkdev_open,它的执行流程为:

do_lastfinish_opendo_dentry_openblkdev_open->bd_acquire(inode)//次inodebdgetblkdev_get(bdev, filp->f_mode, filp)
  1. blkdev_open
    在文件打开的时候将次inode->i_fop赋值给新创建的file->f_ops,并调用其中的blkdev_open,blkdev_open来源于创建块设备文件时,它被初始化为次inode的i_fop即def_blk_fops,blkdev_open调用bd_acquire

  2. bd_acquire
    获取主inode的block_device, 会通过bdget首先来查找是否已经创建了与传入设备号相同的inode,如果已经创建则直接返回,否则调用blockdev_superblock的ops来创建bdev文件系统下的块设备文件的bdev_inode,它包含了主inode和block_device,并建立起了与次inode的关系,注意到address_space是内嵌在inode中,因此address_space也准备好了。
    bdget也会对新创建的主inode进行初始化,其中会初始化inode内嵌的address_space->a_ops为def_blk_aops,它会在读写块设备文件时被调用

  3. blkdev_get
    建立起block_device与底层块设备的关系,这样就可以通过通过读写块设备文件来达到操作块设备的目的。上一步bdget获取了block_device,通过block_device可以获取到gendisk,进一步获取各个分区hd_struct,从而可以实现对磁盘的操作

f2fs学习笔记 - 7. f2fs文件打开相关推荐

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

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

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

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

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

    1.前言 初始流程主要包含f2fs文件系统初始化,以及f2fs文件系统mount 2. init_f2fs_fs init_inodecache 创建f2fs_inode_cache slab描述符 ...

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

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

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

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

  6. C++学习笔记之对文件的操作2

    转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126680.html ** 什么都不说了,继续<C++学习笔记之对文件的 ...

  7. Python学习笔记D9(文件)

    Python学习笔记D9(文件) 文件 1.打开文件 open(file, mode='r') 接收两个参数:文件名(file)和模式(mode),用于打开一个文件,并返回文件对象,如果该文件无法被打 ...

  8. Linux_红帽8学习笔记分享_3(文件操作管理)

    Linux_红帽8学习笔记分享_3(文件操作管理) 文章目录 Linux_红帽8学习笔记分享_3(文件操作管理) 1.Vi编辑器 1.1两种模式 1.2十种技巧 2.用户的家目录 2.1 su命令的使 ...

  9. Keras学习笔记---保存model文件和载入model文件

    Keras学习笔记---保存model文件和载入model文件 保存keras的model文件和载入keras文件的方法有很多.现在分别列出,以便后面查询. keras中的模型主要包括model和we ...

最新文章

  1. 关于C#中的类访问修饰符
  2. linux网络协议栈之数据包处理过程,Linux网络协议栈之数据包处理过程
  3. 网络调试指令ping、telnet、curl
  4. 决策树---ID3算法
  5. 安卓模拟器网页游戏连不上服务器,关于夜神模拟器游戏无法联网的原因和解决方法,请逐一排查...
  6. Myeclipse学习总结(15)——Eclipse/MyEclipse中Maven项目常见问题解决汇总
  7. xquery删除_XQuery实例删除SQL XML文档
  8. hdu 5755 Gambler Bo 高斯消元
  9. 数据库中主键与索引的区别
  10. 网吧如何修改dns服务器地址,网吧更改dns服务器地址
  11. spring boot-Soap协议客户端集成(根据WSDL文档调用WebService、maven的jaxb2插件)
  12. 华为二层网络隔离与互通(vlan隔离与端口隔离)
  13. 关于《走进名企之微软亚洲研究院》的观后感
  14. ie主页被篡改(修改注册表)
  15. 智力问答选择题_智力问答题题库
  16. 双鱼座男适合学计算机专业,双鱼座男生适合的职业
  17. 七大顶级Linux桌面比较
  18. 通过Element开发基础增删改查页面——Vue项目实战(三)
  19. 组装一台稳定的计算机
  20. java模拟交通信号灯_java 多线程交通信号灯模拟过程详解

热门文章

  1. BentoML核心概念(二):API 和 IO 描述符
  2. 数据透视表知识点+案例
  3. 久别重逢,畅快开吃!
  4. 计算机图形渲染基础知识(个人笔记)
  5. 3GP/FLV/AVI 格式整理
  6. GSM Foxit Reader
  7. html文本框中有一个叉号标志,html 输入框显示“小叉叉”的清空图标
  8. 李宏毅深度学习ppt总结
  9. 发送writely和orkut邀请
  10. 21李刚python第四章