c - 如何获取包含文件的底层挂载 block 设备?

标签 c file-io linux-kernel kernel-module

所以,问题是:我有一个 block 设备,例如/dev/sdd1,其中包含一个文件系统,例如EXT3 或 XFS,安装在/mnt/testdisk 下。

还有一个文件,/mnt/testdisk/somefile.bin。

我想要的是获取该文件所在的设备,在本例中为“/dev/sdd1”。而且,更糟糕的是,我必须在用户空间和内核模块中都这样做(它是一个 linux 驱动程序。它不必是可移植的)。

在用户空间: 我目前的尝试是打开

/proc/mounts

并逐行解析以找到路径名的最佳匹配。它有效,但我认为必须有更好的方法...

在内核驱动中: 我正在尝试使用 linux/fs.h header 中的 filp_open 打开文件“/mnt/testdisk/somefile.bin”。

struct file *testfile;
struct inode *inode;
testfile = filp_open("/mnt/testdisk/somefile.bin", (O_RDWR | O_LARGEFILE), OP_FLAGS);
inode = testfile->f_mapping->host;

但是,由于某些原因

inode->i_bdev == NULL

所以我无法从中提取 block 设备路径:(

我知道理论上从内核空间打开文件是一件坏事,但是,无论如何,不​​在乎。

那么,对于每种情况,解决该难题的最佳方法是什么?

最佳答案

我认为您通过访问 /proc/mounts 在用户空间中走上了正确的道路。

但是您不能从内核空间访问用户空间目录(例如。/mnt/...)。我建议您看一下内核如何填充 /proc/mount 并将其用作实现您的功能的起点。

看看 kernel source ,那将是 proc_namespace.c 给你。查看 show_vfsstat 函数。

关于c - 如何获取包含文件的底层挂载 block 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075294/

相关文章:

c - 在 C 中初始化指向结构的指针数组

c - 额外的文件访问或大量的重新分配

c - 有什么方法可以比较正常的 Linux 延迟与 RTAI Linux 延迟测试吗?

启动时的 Android C++ 服务

linux - 在 Ubuntu 16.04 LTS 上编译旧的 Linux 内核

c - 带有结构数组字段的 sprintf - 出现段错误

c - 指向数组的指针究竟是如何工作的?

c - sinf()、cosf() 和 sin()、cos() 之间的任何性能差异

matlab将文件解析为元胞数组

c# - 多个读者更快地阅读文件