f2fs创建一个文件的具体过程
2015-05-12 18:56
399 查看
假设需要创建一个文件/dir/file:
f2fs_sb_info保存了根目录的inode number,假设是0,此时NAT布局如下:
由于inode number就是node number,查找第0个node的块地址,得到4,然后f2fs读SSD上第4个块的数据,得到了根目录的inode:
解析inode的信息,他的数据依次存在了120,200,300,400的块上,读入相关的块后,在逻辑上,我们可以得到根目录下数据块的多级哈希的拓扑结构,它一共有3层,第一层1个bucket,第2层2个bucket,第3层3个bucket。
假设"dir"的hash为19,f2fs先查找第一层,19 % 1 = 0,查找第0个bucket,线性遍历bucket0的bitmap,发现有置位1的entry,比较hash值,看看是否为19,若是,在比较文件名,若为dir,则返回inode number,结果找了一圈没找到;找第二层,19 % 2 = 1,按上个方法查找第二个bucket,第三层查找第三个bucket。得到dir的inode后,根据inode number查询NAT,得到dir inode的实际块地址,并读入该inode。
f2fs为file文件分配了一个inode,inode number为29,在当前的node segment追加写入新的inode,物理地址为100,
由于在node segment分配了新的块,需要修改这个segment的对应的sit_entry,包括bitmap,valiad blocks等信息;需要修改第29个nat entry,将它指向块地址100。此外,需要向父目录dir添加一个dentry,
由于修改了dir的数据块,f2fs向数据segment追加写了被修改的block,并修改SSA上该block对应的summary entry,使得summary entry的inode指向19,offset设置为3,把原来的segment 的sit项也做修改,假设追加的数据块地址为44,由于这个块是dir的第三个直接数据块,则把相关的指针做一下修改,data[3]=44,并追加写到node segment。
由于追加写了inode,还要修改nat表,使得nat[19]=104,
f2fs_sb_info保存了根目录的inode number,假设是0,此时NAT布局如下:
由于inode number就是node number,查找第0个node的块地址,得到4,然后f2fs读SSD上第4个块的数据,得到了根目录的inode:
解析inode的信息,他的数据依次存在了120,200,300,400的块上,读入相关的块后,在逻辑上,我们可以得到根目录下数据块的多级哈希的拓扑结构,它一共有3层,第一层1个bucket,第2层2个bucket,第3层3个bucket。
假设"dir"的hash为19,f2fs先查找第一层,19 % 1 = 0,查找第0个bucket,线性遍历bucket0的bitmap,发现有置位1的entry,比较hash值,看看是否为19,若是,在比较文件名,若为dir,则返回inode number,结果找了一圈没找到;找第二层,19 % 2 = 1,按上个方法查找第二个bucket,第三层查找第三个bucket。得到dir的inode后,根据inode number查询NAT,得到dir inode的实际块地址,并读入该inode。
f2fs为file文件分配了一个inode,inode number为29,在当前的node segment追加写入新的inode,物理地址为100,
由于在node segment分配了新的块,需要修改这个segment的对应的sit_entry,包括bitmap,valiad blocks等信息;需要修改第29个nat entry,将它指向块地址100。此外,需要向父目录dir添加一个dentry,
由于修改了dir的数据块,f2fs向数据segment追加写了被修改的block,并修改SSA上该block对应的summary entry,使得summary entry的inode指向19,offset设置为3,把原来的segment 的sit项也做修改,假设追加的数据块地址为44,由于这个块是dir的第三个直接数据块,则把相关的指针做一下修改,data[3]=44,并追加写到node segment。
由于追加写了inode,还要修改nat表,使得nat[19]=104,
相关文章推荐
- Linux文件系统的的实现:创建一个文件的过程
- 内容输出Linux文件系统的的实现:创建一个文件的过程
- 从 Java 应用程序动态生成 PDF 文件一个简化了 PDF 创建过程的开源库 iText 的分步指南
- 46.如何创建、编译和执行同一个包内的多个文件
- 一个WinForm记事本程序(包含主/下拉/弹出菜单/打开文件/保存文件/打印/页面设置/字体/颜色对话框/剪切版操作等等控件用法以及记事本菜单事件/按键事件的具体代码)
- FindFirstChangeNotification,创建一个文件通知对象,该对象用于监视文件系统发生的变化
- python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数
- 浅析proc文件系统的创建和create_proc_read_entry函数的具体实现
- 在指定目录下创建一个txt文件
- 创建一个设备文件的方法
- 如何创建一个静态库文件,并打包在模拟器和真机上都可以使用。
- 创建一个自定义WebControl控件 WebImageButton的过程
- 练习 2017-08-22 通过控制台,获取类名,字段名称,字段类型,根据一个模板文件,自动创建这个类文件,并且为字段提供setter和getter方法
- 嵌入式 创建一个2G的空文件(Linux命令dd)
- Magento -不创建Block文件,如何直接包含一个.phtml文件
- 分析Linux内核创建一个新进程的过程
- python判断文件是否存在,不存在就创建一个
- 创建一个简单的带事务的存储过程
- 创建standby过程(cp物理文件)
- 一个可执行文件的生成过程到进程在内存中的分布