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
相关产品推荐
相关产品推荐

