+ -
当前位置:首页 → 问答吧 → 系统调用close如何更新文件的属性和数据

系统调用close如何更新文件的属性和数据

时间:2010-08-04

来源:互联网

我们经常说close(fd)系统调用执行完毕后,文件的数据都会写到硬盘上。
但是通过分析2.4.0的sys_close()代码(fs/open.c),发现两个问题:
1、inode对应的ext2_inode没有同步写回磁盘;
2、文件的脏的缓冲区即inode->i_dirty_buffers中的缓冲区没有同步写回磁盘。

sys_close()的调用流程:
-->filp_close()
       -->fput()
              (如果--file->f_count == 0)
              -->dput()
                     (如果--dentry->d_count==0)并且(list_empty(&dentry->d_hash为真)
                     -->dentry_iput()  
                            -->iput()
                                   (可能是,我不太确定)
                                   -->clear_inode()
                                          -->invalidate_inode_buffers()
下面的就不写了。其中invalidate_inode_buffers()只是将inode->i_dirty_buffers指向的链表中的每一项从该链表中删除,并没有将脏的缓冲区立即写到硬盘上。

是不是我遗漏了什么?要不然两个问题如何解释?

作者: panweiping   发布时间: 2010-08-04

1145 int filp_close(struct file *filp, fl_owner_t id)
  1146 {
  1147     int retval = 0;
  1148
  1149     if (!file_count(filp)) {
  1150         printk(KERN_ERR "VFS: Close: file count is 0\n");
  1151         return 0;
  1152     }
  1153
  1154     if (filp->f_op && filp->f_op->flush)
  1155         retval = filp->f_op->flush(filp, id);
  1156
  1157     dnotify_flush(filp, id);
  1158     locks_remove_posix(filp, id);
  1159     fput(filp);
  1160     return retval;
  1161 }

第1155行调用flush,不就是把数据同步到硬盘吗?

作者: bigrat023   发布时间: 2010-08-05

热门下载

更多