【问题标题】:VFS rename operation explainationVFS重命名操作说明
【发布时间】: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


【解决方案1】:

new_dentry 对象的用途是什么? 但是为什么 new_dentry->d_inode 是空的呢?它不应该包含我复制的文件的inode吗?

new_dentry->inode 如果目标已经包含一个文件,则该文件有效,如果重命名成功,该文件将被替换。像mv dir1/file1 dir2/file2 这样的东西,其中file2 将被file1 替换。就您而言,没有替代品;只重命名文件。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多