【问题标题】:get device flags by device name按设备名称获取设备标志
【发布时间】:2011-10-02 09:46:36
【问题描述】:

希望你能帮助我: 我正在尝试确定设备是否可移动,我所拥有的只是设备名称(/dev/sdc)。实际上,我需要通过该文件的完整路径来确定该文件何时在可移动媒体或本地磁盘上。

我尝试在 当前->fs->密码 我能找到的只是一组标志: *current->fs->pwd.mnt->mnt_sb->s_bdev->bd_disk->flags* 其中 GENHD_FL_REMOVABLE 设置为可移动设备

但我总是设置相同的标志(据我了解,s_bdev 总是指向同一个设备 (/dev/sda))。

所以现在我通过解析 mtab 获得了包含我的文件的设备名称 (/dev/sdc),但仍然无法找到,是否可以删除它。

有没有办法通过设备名称获取 block_device 结构? (例如,“文件”结构可以通过调用 fd = 打开(“名称”) fl = fged(fd) 其中 fl 指向“文件”结构)

【问题讨论】:

    标签: c linux kernel block-device


    【解决方案1】:

    您可以使用class_dev_iter_initclass_dev_iter_next 对块设备进行迭代。用法见block/genhd.cblk_lookup_devt中的代码。

    拥有设备后,您可以使用dev_to_disk 获取struct gendisk *,您可以在其中检查可移动标志。

    【讨论】:

    • 所以,使用这种方式,如果我只有该文件的完整路径,我如何确定哪个块设备包含我打开的文件。
    • @Makc:我认为你可以使用vfs_stat,它会给你一个struct kstat,你可以在其中将dev_t与块设备进行比较。
    • 我在使用class_dev_iter_initclass_dev_iter_next 时遇到了一些麻烦。 (系统在class_dev_iter_nextdisk_type 上停止是未定义的,但是他的参数不是必需的。)所以,我发现get_gendisk() 函数接受dev_t 并返回gendisk link,这就是我需要的,但是我怎样才能使用这个功能呢?它在 /include/linux/genhd.h 中定义,但包含此标头会使模块编译时出现警告,并且 insmod 会因 Unknown symbol in module 而失败。那么,是否可以在 kern 模块中使用此功能?
    • @Makc:似乎get_gendisk() 应该在最近的内核中导出,以前没有。如果重新编译内核是一个选项,要么更新内核,要么在 genhd.c 中添加 EXPORT_SYMBOL
    • @Makc:正如我所说,这在更新的内核中发生了变化(尽管我无法确定确切的版本)。虽然我可能找到了一条替代路径,但它有点难看,如vfs_fstatat 通过user_path_at 获取路径,然后通过mnt.mnt_sbdentry.d_sb 到达您的block_devicegendisk
    【解决方案2】:

    读取 /sys/block/dev-name/removable 因为如果设备是可移动的,它应该包含 1,如果不是,它应该包含 0。 (dev-name = 设备名称:sda, hda, fd0, ...)

    【讨论】:

    • 这个我知道,但是在旧的linux版本下它不起作用,谢谢。
    • 另外,我不知道任何从内核模块读取文件的安全方法。 (我试过 sys_read() 和 vfs_read() - 它会导致“糟糕”:))也许你知道从内核模块访问 sysfs 的任何方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多