VFS重命名操作说明

时间:2018-02-12 09:28:10

标签: linux-kernel filesystems kernel inode vfs

我不确定这个问题是否与SO相关,也许线程应该在unix stackexchange上,但由于这是代码,我在这里问。

在Linux VFS中,有一个结构:

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吗?

由于

1 个答案:

答案 0 :(得分:0)

  

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

如果目标已包含文件,则

new_dentry-> inode将有效,如果重命名成功,则将替换该文件。像mv dir1/file1 dir2/file2这样的东西,其中file2将被file1替换。在你的情况下,没有替代品;只重命名文件。