Linux kernel blk#U cleanup#U queue()不';t块设备注销时返回

Linux kernel blk#U cleanup#U queue()不';t块设备注销时返回,linux-kernel,linux-device-driver,device-driver,block-device,Linux Kernel,Linux Device Driver,Device Driver,Block Device,我正在为2.6.43.2-6.fc15上的热插拔PCI内存设备编写一个块设备驱动程序(因此LDD3在很多功能方面都过时了),并且我很难让块设备注销顺利进行。当设备被移除时,我会拆除gendisk和request\u队列,但它挂起在blk\u cleanup\u queue()。在这之前,我可能忽略了一些与队列相关的过程,但是我看不到与我正在使用的内核树中的其他块驱动程序有任何主要的一致性差异(memstick,cciss,等等)。在整理队列和gendisk之前,我应该执行哪些步骤 我正在块操作中

我正在为2.6.43.2-6.fc15上的热插拔PCI内存设备编写一个块设备驱动程序(因此LDD3在很多功能方面都过时了),并且我很难让块设备注销顺利进行。当设备被移除时,我会拆除gendisk和request\u队列,但它挂起在
blk\u cleanup\u queue()
。在这之前,我可能忽略了一些与队列相关的过程,但是我看不到与我正在使用的内核树中的其他块驱动程序有任何主要的一致性差异(
memstick
cciss
,等等)。在整理队列和gendisk之前,我应该执行哪些步骤


我正在
块操作
中实现
.open
.release
.ioctl
,以及
mydev\u请求(struct request\u queue*q)
附加
blk\u init\u队列(mydev\u请求,&mydev->锁)
,但我不确定在发生请求或取消注册块设备时如何整理队列。

这是由于没有结束从队列中提取的请求造成的。要解决此问题,请按如下方式结束请求:

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);
}