Problem in layered block driver using request queues

From: Abhishek
Date: Thu Dec 24 2009 - 20:09:20 EST


Hi All,
I am developing a pseudo driver in linux-2.6.13. My pseudo block
driver sits on top of the underlying hard disk driver and exposes a
block device (/dev/mydev). I mount ext3 on this exposed device, run
benchmarks, and monitor the requests.
I am using a request queue in my pseudo device driver and service the
requests in the queue in a while loop like -
while( (req = elv_next_request(queue)) != NULL)
{
XXXXX
}
Here, I am cloning the bios in requests and notifying completion
(after all bios in a request complete) using the documented functions
(end_that_request_* and blkdev_dequeue_request).


THE PROBLEM:
My problem is that for longer benchmarks, the underlying SCSI layer
(in scsi_lib.c) gives error indications like:
-------------------------------------------------------------------------------------------------
Incorrect number of segments after building list
Dec 22 17:33:25 kernel: [ 729.237018] counted 32, received 6
Dec 22 17:33:25 kernel: [ 729.237020] req nr_sec 256, cur_nr_sec 8
.....
------------------------------------------------------------------------------------------------------
After this, my bi_end_io function gets called with bios NOT uptodate
and after a while the system freezes.
Can anybody help me with some useful pointers..

thanks a lot,
Abhishek.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/