FYI, I have gotten some most strange results with the equivalent of:
request_queue_t *q = kmalloc(...);
blk_init_queue(q, ...)
The problem turns out to be that q->backing_dev_info.memory_backed is not
initialized, leaving it to be whatever was there before. The end result is
that my "driver" never saw write requests, but reads came through fine.
Took a while to figure out that one...
Here's the fix, for what it's worth. (I had, BTW, tried just zeroing the
whole structure in blk_init_queue(), but that makes IDE oops at boot - it
sets q->queuedata early).
q->make_request_fn = mfn;
q->backing_dev_info.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
q->backing_dev_info.state = 0;
+ q->backing_dev_info.memory_backed = 0;
blk_queue_max_sectors(q, MAX_SECTORS);
blk_queue_hardsect_size(q, 512);
blk_queue_dma_alignment(q, 511);