如何从inode / pathname中找到dentry?

时间:2017-04-05 15:17:54

标签: linux linux-kernel inode

我正在开发一个模块,用于在打开时读取文件xattributes。我已经挂钩了sys_open,因此我需要在不打开文件的情况下获取文件的dentry。简而言之,我有inode和绝对路径,但很难弄明白;如何从这些中获取dentry。所有评论都非常感谢。

3 个答案:

答案 0 :(得分:2)

根据我的提示,您在打开回调函数期间尝试从驱动程序模块获取 dentry路径。如果是这样;然后在放下我添加访问dentry信息所需的结构列表的方式之前。

<强> include/linux/fs.h

Struct file{
struct path             f_path;
};

<强> include/linux/path.h

struct path {
           struct vfsmount *mnt;
           struct dentry *dentry;
  };

<强> include/linux/dcache.h

struct dentry {
};

所以你可以这样做。

 static int sample_open(struct inode *inode, struct file *file)
    { 
    char *path, *dentry,*par_dentry;
    char buff[256];
    dentry = file->f_path.dentry->d_iname;
    pr_info("dentry :%s\n",dentry);
    par_dentry = file->f_path.dentry->d_parent->d_iname;
    pr_info("parent dentry :%s\n",par_dentry);
    path=dentry_path_raw(file->f_path.dentry,buff,256);
    pr_info("Dentry path %s\n",path);
    }

答案 1 :(得分:0)

好。其他答案未涵盖如何从路径名/绝对路径获取牙科。以下代码段可以。

    int ret = 0;
    struct path path;

    ret = kern_path("/proc/", LOOKUP_DIRECTORY, &path);
    if (ret)
            pr_err("Failed to lookup /proc/ err %d\n", ret);
    else {
            if (PROC_SUPER_MAGIC != path.mnt->mnt_sb->s_magic)
                    printk("BUG /proc is not mounted as Proc FS, magic %lx\n", path.mnt->mnt_sb->s_magic);
            path_put(&path);
    }

答案 2 :(得分:-1)

问题是错的。扩展属性存储在inode中,因此只要您拥有inode就可以访问它们。

  

我已经连接了sys_open,因此我需要获取dentry   文件没有打开文件。

这是2个帐户的错误。

  1. sys_open不是唯一可以打开文件的地方。
  2. 即使你连接到所有地方,你执行的额外查找也可以找到一个不同的文件而不是打开的那个(考虑一个小丑做cp file1 toopen; cp fil2 toopen in a loop)
  3. 您想要的是使用LSM框架(Linux安全模块)。特别参见security_file_open。

    然而,鉴于问题的质量,我不得不问这是什么。这是一个大学项目吗?我认为你不准备对它进行研究,并建议在可能的情况下改为非内核。