I_DIRTY_SYNC与I_DIRTY_DATASYNC
来源:互联网 发布:大一c语言课程设计题目 编辑:程序博客网 时间:2024/06/16 20:58
I_DIRTY_SYNC与I_DIRTY_DATASYNC
浏览minix_sync_file时,被inode中I_DIRTY_SYNC与I_DIRTY_DATASYNC这两个标志弄糊涂了。一直在纳闷,同步metadata为什么还用两个标记?
int minix_sync_file(struct file * file, struct dentry *dentry, int datasync){ struct inode *inode = dentry->d_inode; int err; err = sync_mapping_buffers(inode->i_mapping); if (!(inode->i_state & I_DIRTY)) return err; if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) return err; err |= minix_sync_inode(inode); return err ? -EIO : 0;}
kernel代码中也没有很好的注释。于是查找minix_sync_file如何被调用的,发现kernel中有两个系统调用最终会调用到minix_sync_file.
SYSCALL_DEFINE1(fsync, unsigned int, fd){ return __do_fsync(fd, 0);}SYSCALL_DEFINE1(fdatasync, unsigned int, fd){ return __do_fsync(fd, 1);}
- fsync: 同步文件的数据块及metadata.
- fdatasync: 同步文件的数据块,在必要时候同步metadata.
我们考虑这种情况,单纯的修改文件的atime,这个时候断电,没有将这部分信息回写到磁盘上,实际上对大部分程序来说,这并没有什么影响。也就是说,只要metadata仅仅修改这部分不是很重要的数据,那么回写过程中可以不回写metadata。
fdatasync就能在metadata修改不是很重要的数据时,不同步metadata,提高系统效率。当然如果像文件长度这种非常重要的数据,在同步过程中就需要马上回写。
再回到minix_sync_file,可以看出fdatasync就是通过判断I_DIRTY_DATASYNC是否被设置,来判断metadata要不要回写。
所以I_DIRTY_DATASYNC就是用来标记在metadata中是否有重要数据被修改。当fdatasync发现了I_DIRTY_DATASYNC被设置,就知道metadata需要马上回写了。
0 0
- I_DIRTY_SYNC与I_DIRTY_DATASYNC
- 与
- 与
- “” 与 “”
- ##与#
- >> 与 > >
- :与::
- &与&&
- && 与 &
- [[与((
- >>与>>>
- *与++
- *与++
- ++与++
- ->与 .
- :与::
- & | 与&& ||
- &&与&
- 琐碎知识点
- [SIM] SIM hot swap EINT module configuration for MT6572/MT6582/MT6592/MT6571
- iOS应用架构谈 view层的组织和调用方案
- CI框架源码研读(整体架构)
- Emacs Auctex 设置编译方式
- I_DIRTY_SYNC与I_DIRTY_DATASYNC
- JavaFX和可视化信息抽取
- java日期格式的转换
- 每天15min-HTML5(12)-表单(下)
- 表单增强与验证——提交表单(处理submit事件以及获取表单的值)
- pip在配置文件中使用国内的源
- Android从摄像头或相册中获取照片
- 安卓中自定义view控件代替radiogroup实现颜色渐变效果的写法
- CI框架源码研读(路由解析)