0

我在2.6.43.2-6.fc15上爲可熱插拔PCI存儲設備寫了塊設備驅動程序(所以LDD3已過時了很多的功能),我無法使塊設備取消註冊順利進行。當設備被移除時,我去拆除gendisk和request_queue,但它掛在blk_cleanup_queue()。據推測,在這之前我忽略了一些與隊列相關的進程,但我無法看到來自該內核樹的其他塊驅動程序與我用作參考的其他塊驅動程序(memstick,cciss等)之間的任何主要一致差異。在整理隊列和Gendisk之前,我應該執行哪些步驟?blk_cleanup_queue()在塊設備註銷時不返回

我實現.open.release.ioctlblock_ops以及附有blk_init_queue(mydev_request, &mydev->lock)一個mydev_request(struct request_queue *q),但我不知道究竟如何整理隊列既可以當請求發生時或取消註冊塊設備。

回答

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