我试图通过检查它们的 inode 和设备 ID 是否匹配来比较两个文件名是否引用同一个文件。目前,我打电话vfs_stat
来获取ID。
问题是,如果我传递vfs_stat
一个存储在用户空间中的文件名,它可以正常工作,但是如果我传递一个文件名,该文件名作为全局变量存储在我的内核模块中,它会出错EFAULT
如果两个文件相同,是否有其他方法可以获取 ID 或比较?
我试图通过检查它们的 inode 和设备 ID 是否匹配来比较两个文件名是否引用同一个文件。目前,我打电话vfs_stat
来获取ID。
问题是,如果我传递vfs_stat
一个存储在用户空间中的文件名,它可以正常工作,但是如果我传递一个文件名,该文件名作为全局变量存储在我的内核模块中,它会出错EFAULT
如果两个文件相同,是否有其他方法可以获取 ID 或比较?
vfs_stat
获取存储在用户空间中的文件名。但是,如果您在源代码中跟踪该调用,您会看到(在 fs/stat.c 中)基本上有两个部分。从用户空间文件名字符串中查找struct path
,然后根据路径结构的内容调用 VFS stat 操作。所以你可以从内核空间做同样的事情。查看kern_path()
以查找struct path
存储在内核空间中的文件名。从那里,你可以vfs_getattr()
直接打电话。完成后不要忘记path_put
。
基本上,您正在使用vfs_fstatat()
. 但也要考虑是否可以在没有 stat 调用的情况下进行管理。在 path 结构中的某个地方有一个 inode 指针,这对于您正在尝试做的事情可能已经足够了。