super block 的put_super 接口需要通过f2fs_write_checkpoint() 来把没有来得及umount导致的可能不一致的数据重新做一次check point。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. /* … * We don’t need to do checkpoint when superblock is clean. * But, the previous checkpoint w...
函数write_checkpoint中,会调用block_operations,函数中有这样一段代码:1 2 3 4 5 6 7 8 9 10 11 12 retry_flush_dents: f2fs_lock_all(sbi); /* write all the dirty dentry pages */ if (get_pages(sbi, F2FS_DIRTY_DENTS)) { f2fs_unlock_all(sbi); sync_dirty_dir_inodes(sbi); if (...
f2fs_write_checkpoint intf2fs_write_checkpoint(structf2fs_sb_info*sbi,structcp_control*cpc){...// 阻塞文件系统写操作err=block_operations(sbi);// 提交sbi中缓存的bio(可能经过合并了的)f2fs_flush_merged_writes(sbi);// 获取当前的CP版本号ckpt_ver=cur_cp_version(ckpt);// CP版本号...
checkpoint.c: .writepage = f2fs_write_meta_page, checkpoint.c: .writepages = f2fs_write_meta_pages, data.c: .writepage = f2fs_write_data_page, data.c: .writepages = f2fs_write_data_pages, node.c: .writepage = f2fs_write_node_page, node.c: .writepages = f2fs_write_node_pages, ...
f2fs_write_checkpoint --> do_checkpoint --> f2fs_write_data_summaries --> write_compacted_summaries 或 write_normal_summaries mount f2fs时,路径1读取compatcted/normal summaries到内存中。 9)脏元数据页写入nat block(即持久化存储) worker_thread --> process_one_work --> wb_workfn --> wb_do...
f2fs_write_root_inode():在main area创建root inode f2fs_update_nat_root():继续初始化NAT,即在该区域记录root inode的地址映射 f2fs_add_default_dentry_root():更新dentry block 后面我们来看这一大段代码 /*** @brief It initializes and writes root inode on device.* @param None* @return 0 if ...
* Write checkpoint to reclaim prefree segments. * We need more three extra sections for writer's data/node/dentry. */ if (free_sections(sbi) <= upper_secs + NR_GC_CHECKPOINT_SECS && prefree_segments(sbi)) { ret = f2fs_write_checkpoint(sbi, &cpc); if (ret)2...
-会产生小范围的random write; image.png image.png image.png image.png -SSR 条件 image.png 2.5 避免高fsync 开销-fsync 加速 fsync 不trigger checkpoint 只更新data block 和indirect block,不写入其他metadata 设置一个flag在其他indirect block 向前回滚恢复负责所有fsync的未做工作(更新indirect block和其他met...
footer->cp_ver分别用来记录当前的checkpoint的version,恢复的时候比较version版本确定如何进行数据恢复。 footer->next_blkaddr则是用来记录这个node对应下一个node page的地址,也是用来恢复数据 f2fs_inode结构 我们先看f2fs_inode的结构,省略其他元数据的信息,重点关注文件如何索引的,结构如下: ...
.write_iter = f2fs_file_write_iter, .open = f2fs_file_open, .release = f2fs_release_file, .mmap = f2fs_file_mmap, .flush = f2fs_file_flush, .fsync = f2fs_sync_file, .fallocate = f2fs_fallocate, .unlocked_ioctl = f2fs_ioctl, ...