1

我试图通过检查它们的 inode 和设备 ID 是否匹配来比较两个文件名是否引用同一个文件。目前,我打电话vfs_stat来获取ID。

问题是,如果我传递vfs_stat一个存储在用户空间中的文件名,它可以正常工作,但是如果我传递一个文件名,该文件名作为全局变量存储在我的内核模块中,它会出错EFAULT

如果两个文件相同,是否有其他方法可以获取 ID 或比较?

4

1 回答 1

2

vfs_stat获取存储在用户空间中的文件名。但是,如果您在源代码中跟踪该调用,您会看到(在 fs/stat.c 中)基本上有两个部分。从用户空间文件名字符串中查找struct path,然后根据路径结构的内容调用 VFS stat 操作。所以你可以从内核空间做同样的事情。查看kern_path()以查找struct path存储在内核空间中的文件名。从那里,你可以vfs_getattr()直接打电话。完成后不要忘记path_put

基本上,您正在使用vfs_fstatat(). 但也要考虑是否可以在没有 stat 调用的情况下进行管理。在 path 结构中的某个地方有一个 inode 指针,这对于您正在尝试做的事情可能已经足够了。

于 2012-11-26T15:05:24.093 回答