linux/block
Kiyoshi Ueda 4ee5eaf451 block: add a queue flag for request stacking support
This patch adds a queue flag to indicate the block device can be
used for request stacking.

Request stacking drivers need to stack their devices on top of
only devices of which q->request_fn is functional.
Since bio stacking drivers (e.g. md, loop) basically initialize
their queue using blk_alloc_queue() and don't set q->request_fn,
the check of (q->request_fn == NULL) looks enough for that purpose.

However, dm will become both types of stacking driver (bio-based and
request-based).  And dm will always set q->request_fn even if the dm
device is bio-based of which q->request_fn is not functional actually.
So we need something else to distinguish the type of the device.
Adding a queue flag is a solution for that.

The reason why dm always sets q->request_fn is to keep
the compatibility of dm user-space tools.
Currently, all dm user-space tools are using bio-based dm without
specifying the type of the dm device they use.
To use request-based dm without changing such tools, the kernel
must decide the type of the dm device automatically.
The automatic type decision can't be done at the device creation time
and needs to be deferred until such tools load a mapping table,
since the actual type is decided by dm target type included in
the mapping table.

So a dm device has to be initialized using blk_init_queue()
so that we can load either type of table.
Then, all queue stuffs are set (e.g. q->request_fn) and we have
no element to distinguish that it is bio-based or request-based,
even after a table is loaded and the type of the device is decided.

By the way, some stuffs of the queue (e.g. request_list, elevator)
are needless when the dm device is used as bio-based.
But the memory size is not so large (about 20[KB] per queue on ia64),
so I hope the memory loss can be acceptable for bio-based dm users.

Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
2008-10-09 08:56:18 +02:00
..
as-iosched.c block: make kblockd_schedule_work() take the queue as parameter 2008-10-09 08:56:09 +02:00
blk-barrier.c block: adjust blkdev_issue_discard for swap 2008-10-09 08:56:17 +02:00
blk-core.c block: add a queue flag for request stacking support 2008-10-09 08:56:18 +02:00
blk-exec.c Add some block/ source files to the kernel-api docbook. Fix kernel-doc notation in them as needed. Fix changed function parameter names. Fix typos/spellos. In comments, change REQ_SPECIAL to REQ_TYPE_SPECIAL and REQ_BLOCK_PC to REQ_TYPE_BLOCK_PC. 2008-10-09 08:56:03 +02:00
blk-integrity.c block: implement and use {disk|part}_to_dev() 2008-10-09 08:56:07 +02:00
blk-ioc.c cfq-iosched: fix RCU race in the cfq io_context destructor handling 2008-05-07 09:28:57 +02:00
blk-map.c block: make blk_rq_map_user take a NULL user-space buffer 2008-10-09 08:56:11 +02:00
blk-merge.c block: inherit CPU completion on bio->rq and rq->rq merges 2008-10-09 08:56:09 +02:00
blk-settings.c block: unify request timeout handling 2008-10-09 08:56:13 +02:00
blk-softirq.c block: add fault injection mechanism for faking request timeouts 2008-10-09 08:56:17 +02:00
blk-sysfs.c block: add support for IO CPU affinity 2008-10-09 08:56:09 +02:00
blk-tag.c Add some block/ source files to the kernel-api docbook. Fix kernel-doc notation in them as needed. Fix changed function parameter names. Fix typos/spellos. In comments, change REQ_SPECIAL to REQ_TYPE_SPECIAL and REQ_BLOCK_PC to REQ_TYPE_BLOCK_PC. 2008-10-09 08:56:03 +02:00
blk-timeout.c block: use rq complete marking in blk_abort_request() 2008-10-09 08:56:17 +02:00
blk.h block: add fault injection mechanism for faking request timeouts 2008-10-09 08:56:17 +02:00
blktrace.c blktrace: simplify flags handling in __blk_add_trace 2008-10-09 08:56:01 +02:00
bsg.c block: introduce struct rq_map_data to use reserved pages 2008-10-09 08:56:10 +02:00
cfq-iosched.c cfq-iosched: fix queue depth detection 2008-10-09 08:56:09 +02:00
cmd-filter.c block: move holder_dir from disk to part0 2008-10-09 08:56:08 +02:00
compat_ioctl.c Add BLKDISCARD ioctl to allow userspace to discard sectors 2008-10-09 08:56:02 +02:00
deadline-iosched.c deadline-iosched: non-functional fixes 2008-10-09 08:56:03 +02:00
elevator.c block: Add interface to abort queued requests 2008-10-09 08:56:13 +02:00
genhd.c block: add fault injection mechanism for faking request timeouts 2008-10-09 08:56:17 +02:00
ioctl.c block: make partition array dynamic 2008-10-09 08:56:08 +02:00
Kconfig block: Block layer data integrity support 2008-07-03 13:21:13 +02:00
Kconfig.iosched
Makefile block: unify request timeout handling 2008-10-09 08:56:13 +02:00
noop-iosched.c block: let elv_register() return void 2007-12-18 08:29:28 +01:00
scsi_ioctl.c block: introduce struct rq_map_data to use reserved pages 2008-10-09 08:56:10 +02:00