You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux块设备重定向内核模块在submit_bio/submit_bio_wait处冻结

块设备重定向内核模块挂起问题

正在开发一款Linux内核模块,该模块创建块设备my_device,用于将所有bio请求重定向至物理设备/dev/sdb,猜测问题出在自定义make_request函数对bio结构体的处理上。

此前通过创建简单RAM块设备学习块设备开发,该设备运行正常:使用blk_queue_make_request为设备定义自定义make_request函数,解析bio并通过memcpy与缓冲区进行读写操作,可执行echo "Hello" > /dev/my_device写入及dd if=/dev/my_device bs=512 skip=0 count=1读取操作。

现在希望用真实块设备作为后端替代缓冲区,逻辑与RAM设备一致——在my_dev_make_request函数中处理bio,实现方式为克隆bio、修改目标设备为物理设备、提交代理bio并结束原bio的IO。但加载模块后,dmesg显示"submitting proxy bio to physical device",代码在submit_bio处冻结;执行dd if=/dev/my_device bs=512 skip=0 count=1会无限挂起,无法用CTRL-C终止。

尝试过以下方法但未解决问题:

  • 用submit_bio_wait替换submit_bio
  • 将GFP_KERNEL改为GFP_NOIO
  • 用bio->bi_disk = bdev->bd_disk;和bio->bi_partno = bdev->bd_partno;替代bio_set_dev

曾找到一个10年前的类似未解决问题。

内容的提问来源于stack exchange,提问作者Ivan Morozko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:59:57