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
原创粉丝点击