blk_cleanup_queue()在块设备注销时不返回

时间:2012-11-26 11:39:00

标签: linux-kernel linux-device-driver device-driver block-device

我正在为2.6.43.2-6.fc15上的热插拔PCI内存设备编写一个块设备驱动程序(因此LDD3已经过时了很多功能)而且我无法获得阻止设备取消注册顺利进行。删除设备后,我会拆除gendisk和request_queue,但它会挂起blk_cleanup_queue()。据推测,在此之前我忽略了一些与队列相关的进程,但我看不出与我用于引用的内核树中的其他块驱动程序存在任何重大的一致差异(memstick,{{1等等)。在整理队列和gendisk之前我应该​​执行哪些步骤?

我正在cciss中实施.open.release.ioctl以及block_ops附加的mydev_request(struct request_queue *q),但是我我不确定在请求发生时或取消注册块设备时如何整理队列。

1 个答案:

答案 0 :(得分:0)

这是因为没有结束您从队列中获取的请求。要解决此问题,请按以下步骤结束请求:

while ((req = blk_fetch_request(q)) != NULL )
{
    res = mydev_submit_request_sg(mydev, req);

    if (res)
        __blk_end_request_all(req, res);
    else
        __blk_end_request_cur (req, res);
}