我不确定这个问题是否与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吗?
由于
答案 0 :(得分:0)
如果目标已包含文件,则new_dentry对象的目的是什么? 但为什么new_dentry-> d_inode为空?它不应该包含我复制的文件的inode吗?
new_dentry-> inode将有效,如果重命名成功,则将替换该文件。像mv dir1/file1 dir2/file2
这样的东西,其中file2将被file1替换。在你的情况下,没有替代品;只重命名文件。