【发布时间】:2018-07-22 10:11:45
【问题描述】:
我不确定这个问题是否与 SO 相关,也许线程应该在 unix stackexchange 上,但由于这是代码,我在这里问。
在linux VFS中,有一个struct:
struct inode_operations {
...
int (*rename) (struct inode *, struct dentry *,
struct inode *, struct dentry *, unsigned int);
...
让我们改写一下签名:
int (*rename) (struct old_inode *, struct old_dentry *,
struct new_inode *, struct new_dentry *, unsigned int);
我的测试场景是:
在源目录(inode=462251)上,我创建了文件(inode=516564),将它移动到目标目录(inode=516511)。
调查对象后发现:
old_inode = 源目录
old_dentry = 我移动的文件系统对象
new_inode = 目标目录
new_dentry = ?
如果我检查 new_dentry->d_inode,它是空的。
如果我检查 old_dentry->d_inode,它的 inode 编号就是我复制的文件。
我希望 old_dentry->d_inode 在移动后将为空,而 new_dentry->d_inode 将具有移动文件的值。
new_dentry 对象的用途是什么?
如果我打印 old_dentry->d_iname 和 new_dentry->d_iname - 我收到了复制文件的名称,但为什么 new_dentry->d_inode 为空?它不应该包含我复制的文件的inode吗?
谢谢
【问题讨论】:
-
参数
new_dentry指的是dentry对象,将由.rename()操作创建。相同的方法(传递将被填充的dentry)用于其他inode 操作,例如.lookup、.create。在调用操作时,new_dentry对象尚未完全构造。顺便说一句,rename操作通常是文件系统开发人员最复杂的操作之一。 -
所以 new_dentry 是新的文件系统对象,new_inode 是它所在的目录(重命名后)?
-
是的,
new_inode表示应该创建新文件的目录。
标签: linux-kernel filesystems kernel inode vfs