2002-01-10 21:27:43

by Michael Zhu

[permalink] [raw]
Subject: About block device request function.

Hi, I have a question of the block device request
function. I use the following sentences to change the
request function of a block device.

spin_lock_irq(&io_request_lock);

original_make_request_fn =
blk_dev[i].request_queue.make_request_fn;

blk_dev[i].request_queue.make_request_fn =
kti_make_request_fn;

spin_unlock_irq(&io_request_lock);

"i" is the major number of a block device.

You know blk_dev[] is the global block device array.
When I use those sentences to change the floppy block
device's request function, it works. The major number
of the floppy disk is 2. But when I use the same one
to change the hard disk's request function, it doesn't
work. I found that the
blk_dev[3].request_queue.make_request_fn is NULL. Does
that mean that the make_request_fn() of the hard disk
is NULL. I can't believe it. Can anyone give me an
answer?

Michael


______________________________________________________________________
Web-hosting solutions for home and business! http://website.yahoo.ca


2002-01-11 06:42:45

by Jens Axboe

[permalink] [raw]
Subject: Re: About block device request function.

On Thu, Jan 10 2002, Michael Zhu wrote:
> Hi, I have a question of the block device request
> function. I use the following sentences to change the
> request function of a block device.
>
> spin_lock_irq(&io_request_lock);
>
> original_make_request_fn =
> blk_dev[i].request_queue.make_request_fn;
>
> blk_dev[i].request_queue.make_request_fn =
> kti_make_request_fn;
>
> spin_unlock_irq(&io_request_lock);
>
> "i" is the major number of a block device.
>
> You know blk_dev[] is the global block device array.
> When I use those sentences to change the floppy block
> device's request function, it works. The major number
> of the floppy disk is 2. But when I use the same one
> to change the hard disk's request function, it doesn't
> work. I found that the
> blk_dev[3].request_queue.make_request_fn is NULL. Does
> that mean that the make_request_fn() of the hard disk
> is NULL. I can't believe it. Can anyone give me an
> answer?

Read drivers/block/ll_rw_blk.c:blk_get_queue() -- either a driver uses
the statically allocated per-major queue, or it provides its own and
defines a get_queue function to return it.

You are still heading in the wrong direction :/

--
Jens Axboe