4

我需要知道如何获取路径名dentrystruct file从给定的 inode 中获取。

file_open用来从路径名中获取struct file,但总是给内核恐慌。我需要一种方法来比较我的 inode 列表中的一个 inode 与路径名中的一个 inode,或者比较磁盘中的所有 inode 以找到相应的路径名,然后与我的 inode 列表进行比较。

4

2 回答 2

4

此示例代码在 Linux 内核版本 2.6.xx 中运行良好

struct dentry *sample_dentry = NULL;
struct inode *tmp_inode = &inode_need_to_get;
struct list_head *tmp_list = NULL;
list_for_each(tmp_list, &(tmp_inode->i_dentry))
{
    sample_dentry = list_entry(tmp_list, struct dentry, d_alias);
    printk(KERN_EMERG, "name of file is %s\n", sample_dentry->d_iname);
}

如果此文件有硬链接,每个 inode 对象将有一个或多个 dentries 对象。

于 2017-07-04T09:52:57.793 回答
1

一般来说,这是极难做到的。

一个 inode 可能有数千个路径名。所有名称都同样“有效”。即使在不支持多链接的文件系统上,该文件也可以绑定安装数千次到系统中的任何其他位置。

AppArmor和TOMOYO强制访问控制系统 依赖于路径名——但有一个巨大的区别:访问控制是在特定文件描述符上执行的,该文件描述符以特定名称打开,并且两个工具都使用特定名称。

查看security/apparmor/path.c函数aa_get_name()security/tomoyo/file.c函数tomoyo_get_realpath()以获取有关从 inode 查找路径名的详细信息 - 给出额外的支持信息。仅从普通的 inode 对象来看,我认为您可能不走运。

于 2011-12-19T02:31:56.303 回答