如何获得包含文件的底层安装块设备?

时间:2014-06-06 06:08:15

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

所以,问题是:我有一个块设备,例如,/ 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

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

我知道理论上从内核空间打开文件是件坏事,但是,不管怎样,不关心。

那么,对于每个案例,解决这个难题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

我认为您通过访问/proc/mounts在用户空间中采用正确的方式。

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

查看kernel sourceproc_namespace.c为您。看一下show_vfsstat函数。

答案 1 :(得分:0)

对于用户空间部分,我会使用df -h:

df -h /mnt/testdisk/somefile.bin

对于内核部分,您可以使用以下命令获取struct block_device:

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;

还有一个相关问题here