LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1533|回复: 4

关于文件的读写与inode的关系

[复制链接]
发表于 2007-5-19 10:23:40 | 显示全部楼层 |阅读模式
系统:
RH9, kernel 2.4.20-8

我修改了ext2文件系统的inode的一些操作, 希望可以利用ext2_inode里面的一个没被用到的字段来存储我需要的信息.
这个通过修改linux/fs/ext2/inode.c里面的
ext2_read_inode

ext2_update_inode
还有linux/include/linux/fs.h的inode结构(添加一个字段)
可以完成.
因为我觉得涉及到inode读写的操作最终都是通过这两个函数来操作的.
并且通过我自己添加的系统调用(读, 写)来证明是可行的.

但是出现一个问题
被我修改过那个字段的inode所对应的文件, 只要文件的内容被修改过, 那个字段的信息就会丢失. 但是如果知识读文件, 修改文件访问数行(chmod)或者增加链接(ln), 都不会导致那个字段的丢失.
我在源码里面搜索过那个字段是没有被用到的, 这个应该可以保证.

想请教一下各位, 到底文件读写在更新inode的时候(例如访问时间, 修改时间), 是怎样做到修改inode的呢? 又或者说, 系统是否在读入了inode之后又对inode做过一些什么操作导致丢失了原来的一些信息呢?
发表于 2007-5-22 18:41:56 | 显示全部楼层
关于Linux的VFS,有四个基本的object需要了解,superblock object,inode object,file object,dentry object。
superblock: 这个你应该知道,所谓的超级块,存储文件系统信息
inode object:对应一个文件(inode number identified),存储文件的一些信息
file object: 文件描述符
dentry object: 存储目录文件中对应的子文件的链接信息(包括一个inode的指针)
下图描述了他们之间的关系:
Process --->File object ----> dentry object ----> inode object->Super block object --->disk file     

ext2_update_inode这个接口是将inode 的信息写到对应的文件系统的inode,这里应该是ext2 inode中去,并且还有一个sync标记指示是否需要synchronous操作。
关于inode更新的操作,建议你仔细看看VFS的文档,几年前写过一个小文件系统,但是记不起来具体的了:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-22 21:24:36 | 显示全部楼层
To: Sakur_Fre

嗯, 我了解过这四个几本的对象.
我当时就是因为希望能够自己控制ext2的inode的一个字段, 所以才会把注意力放在最后写入磁盘的这个ext2_update_inode()函数上.
但是仍然是如我第一个帖子所说, 这个函数我觉得应该是把inode写入磁盘的操作系统的最底层的函数了, 函数的最后把buffer标记为dirty, 然后根据sync来决定是否写入.
写入已是
ll_rw_block (WRITE, 1, &bh);
这个函数的工作了, 就如这个函数的注释的第一句所说:
* ll_rw_block: low-level access to block devices

这已是底层访问块设备的事情了.

我觉得我这个推论应该是正确的, 但是我实在没想明白为何写文件的操作会使得我用到的那个字段的内容被清除掉.


又或者这么说, 如果不是我说写文件的操作会清除掉我在ext2_inode里面设置的那个字段, Sakur_Fre你觉得我这样来做会出现这个情况吗?
回复 支持 反对

使用道具 举报

发表于 2007-5-23 20:47:25 | 显示全部楼层
ll_rw_block确实是request IO,从而写入block到disk上。你这个问题我没有遇到过,对inode的操作都在super_operations这个结构体中,诸如read inode,write inode等,我在网上见过可以在struct inode中加field,但是没有发现过你现在的问题.
建议你一个方法,搜搜Kernel Tree的ChangeLog,看看是否有对struct inode的修改,比如说增加某个字段,然后看看相应的还需要在什么地方作修改。VFS的整体架构很容易理解,但是编码上只能看代码了...:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-23 21:01:14 | 显示全部楼层
我确实修改过struct inode, 因为我需要在vfs的inode中记录ext2_inode里面我使用到的那个字段.
但是对于ext2_inode里面我使用的那个字段, 我搜索过内核的代码, 并没有用到, 这就可以排除了VFS也会使用到那个字段的可能了.

呵呵...真是搞不明白为什么写文件会修改那个字段...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表