2017-04-05 33 views
1

我正在开发一个模块来读取文件xattributes。我迷上了sys_open,由于这个原因,我需要在不打开文件的情况下获取文件的dentry。简而言之,我有inode和绝对路径,但无法弄清楚;如何从这些获得dentry。所有意见都非常感谢。如何从inode/pathname找到一个dentry?

+0

http://stackoverflow.com/questions/8556461/how-to-obtain-a-pathname-or-dentry-or-struct-file-from-a-given-inode – ilansch

回答

2

按我低估了你正在尝试开放的回调函数期间从您的驱动器模块的目录项路径。如果是这样;然后在放下之前添加访问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); 
    } 
+0

我们实际上试图获得来自文件路径的dentry结构。我们需要它来访问属于该文件的dentry中的xattributes。我们不需要dentry路径本身 –

+0

@BenAtkinson我不明白。 ***你的意思是通过获得dentry结构***。你是否正在寻找像'custom_structure-> mydent = file-> f_path.dentry;'或者其他更类似于你自定义函数的dentry结构? –

0

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

我挂钩了sys_open,因此我需要在不打开文件的情况下得到 文件的dentry。

这是错误的2个帐户。

  1. SYS_OPEN不是能打开一个文件的唯一地方。
  2. 就算你勾搭成所有的地方,你执行额外的查找可以找到一个不同文件比得到了打开了一个(考虑一个小丑做CP文件1 toopen; CP FIL2在一个循环toopen)

你想要的是使用LSM框架(Linux安全模块)。具体见security_file_open。

但是,鉴于问题的质量,我不得不问这是什么。这是一个大学项目吗?我认为你没有准备好开发它,并且建议尽可能转换为非内核版本。