Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165448
  • 博文数量: 22
  • 博客积分: 126
  • 博客等级: 入伍新兵
  • 技术积分: 459
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-26 21:14
文章分类
文章存档

2013年(22)

我的朋友

分类: LINUX

2013-08-04 18:26:53

I_DIRTY是三个标志I_DIRTY_SYNC,I_DIRTY_DATASYNC,I_DIRTY_PAGES的组合,其中,I_DIRTY_SYNC,I_DIRTY_PAGES分别表示:inode的属性(如:修改时间)改变和inode有脏页,I_DIRTY_DATASYNC的含义就不太容易理解,我们先从sys_write()看inode的DIRTY标志的变化:
1.无论是否有数据写入,文件的修改时间都会更新,即I_DIRTY_SYNC标志会置位
sys_write()
 __generic_file_aio_write_nolock()
  file_update_time()
   mark_inode_dirty_sync()
    __mark_inode_dirty(inode, I_DIRTY_SYNC);

2.有数据写入成功时,I_DIRTY_PAGES标志会置位
sys_write()
 __block_commit_write()
  mark_buffer_dirty()
   __set_page_dirty()
    __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);

3.扩展了文件后,I_DIRTY_DATASYNC标志会置位
sys_write()
 generic_write_end()
  if (pos+copied > inode->i_size){
   mark_inode_dirty()
    __mark_inode_dirty(inode, I_DIRTY_SYNC|I_DIRTY_PAGES|I_DIRTY_DATASYNC);
  }

其次,从ext2_sync_file()和__sync_single_inode()看inode的回写逻辑:
1.sys_fdatasync()因为只需要回写文件的数据部分,如果I_DIRTY_DATASYNC没有置位,则无需回写inode
ext2_sync_file()
 if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
  return ret;
 err = ext2_sync_inode(inode); 

2.I_DIRTY_DATASYNC置位时,需要回写inode
__sync_single_inode()
 if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
  int err = write_inode(inode, wait);
  if (ret == 0)
   ret = err;
 } 

综上,对于ext文件系统来说,至少可以认为I_DIRTY_DATASYNC表示文件的树结构发生了变化,因为sys_write()扩展文件后,文件的树结构肯定发生了变化,此后sys_fdatasync()就必须将最新的树结构(也就是inode本身)回写到磁盘才能保证文件数据的完整性,反之,如果文件的树结构未变化,sys_fdatasync()只需将脏页回写即可保证数据完整性.

阅读(4589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~