C 如何获取包含文件的底层已装入块设备?

C 如何获取包含文件的底层已装入块设备?,c,file-io,linux-kernel,kernel-module,C,File Io,Linux Kernel,Kernel Module,所以,问题是:我有一个块设备,例如/dev/sdd1,它包含一个文件系统,例如EXT3或XFS,安装在/mnt/testdisk下 还有一个文件,/mnt/testdisk/somefile.bin 我想要的是获取文件所在的设备,在本例中为“/dev/sdd1”。而且,更糟糕的是,我必须在用户空间和内核模块(它是一个linux驱动程序,不必是可移植的)中都这么做 在用户空间中: 我目前的尝试是打开 /proc/mounts 并逐行解析它,以找到路径名的最佳匹配项。这是可行的,但我认为一定有更好

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

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

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

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

/proc/mounts
并逐行解析它,以找到路径名的最佳匹配项。这是可行的,但我认为一定有更好的方法

在内核驱动程序中: 我正在尝试从linux/fs.h头使用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
因此,我无法从中提取块设备路径:(

我知道理论上从kernelspace打开文件是件坏事,但不管怎样,我不在乎


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

我认为通过访问
/proc/mounts
,您在用户空间中走的路是正确的

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


请看一下,这将是
proc\u namespace.c
。请看一下
show\u vfsstat
函数。

对于用户空间部分,我将选择df-h:

df -h /mnt/testdisk/somefile.bin
对于内核部分,您可以使用以下方法获取struct block_设备:

struct file *testfile;
struct block_device *bdev;

testfile = filp_open("/mnt/testdisk/somefile.bin", (O_RDWR | O_LARGEFILE), OP_FLAGS);
bdev = testfile->f_inode->i_sb->s_bdev;
还有一个相关的问题