linux/block
Tejun Heo 2920ebbd65 block: add timer on blkdev_dequeue_request() not elv_next_request()
Block queue supports two usage models - one where block driver peeks
at the front of queue using elv_next_request(), processes it and
finishes it and the other where block driver peeks at the front of
queue, dequeue the request using blkdev_dequeue_request() and finishes
it.  The latter is more flexible as it allows the driver to process
multiple commands concurrently.

These two inconsistent usage models affect the block layer
implementation confusing.  For some, elv_next_request() is considered
the issue point while others consider blkdev_dequeue_request() the
issue point.

Till now the inconsistency mostly affect only accounting, so it didn't
really break anything seriously; however, with block layer timeout,
this inconsistency hits hard.  Block layer considers
elv_next_request() the issue point and adds timer but SCSI layer
thinks it was just peeking and when the request can't process the
command right away, it's just left there without further processing.
This makes the request dangling on the timer list and, when the timer
goes off, the request which the SCSI layer and below think is still on
the block queue ends up in the EH queue, causing various problems - EH
hang (failed count goes over busy count and EH never wakes up),
WARN_ON() and oopses as low level driver trying to handle the unknown
command, etc. depending on the timing.

As SCSI midlayer is the only user of block layer timer at the moment,
moving blk_add_timer() to elv_dequeue_request() fixes the problem;
however, this two usage models definitely need to be cleaned up in the
future.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
2008-11-06 08:41:55 +01:00
..
as-iosched.c block: as/cfq ssd idle check update 2008-10-09 08:56:19 +02:00
blk-barrier.c block: adjust blkdev_issue_discard for swap 2008-10-09 08:56:17 +02:00
blk-core.c Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block 2008-10-17 09:29:55 -07: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: Switch blk_integrity_compare from bdev to gendisk 2008-10-09 08:56:21 +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: remove unused ll_new_mergeable() 2008-11-06 08:41:55 +01:00
blk-settings.c block: move q->unplug_work initialization 2008-10-17 08:46:57 +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 block: reserve some tags just for sync IO 2008-10-09 08:56:19 +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: remove __generic_unplug_device() from exports 2008-10-17 14:03:08 +02:00
blktrace.c blktrace: use BLKTRACE_BDEV_SIZE as the name size for setup structure 2008-10-09 08:56:20 +02:00
bsg.c [PATCH] switch scsi_cmd_ioctl() to passing fmode_t 2008-10-21 07:47:14 -04:00
cfq-iosched.c block: as/cfq ssd idle check update 2008-10-09 08:56:19 +02:00
cmd-filter.c [PATCH] introduce fmode_t, do annotations 2008-10-21 07:47:06 -04:00
compat_ioctl.c compat_blkdev_driver_ioctl: Remove unused variable warning 2008-10-23 10:28:25 -07:00
deadline-iosched.c deadline-iosched: non-functional fixes 2008-10-09 08:56:03 +02:00
elevator.c block: add timer on blkdev_dequeue_request() not elv_next_request() 2008-11-06 08:41:55 +01:00
genhd.c proc: move /proc/diskstats boilerplate to block/genhd.c 2008-10-23 17:57:37 +04:00
ioctl.c [PATCH] kill the rest of struct file propagation in block ioctls 2008-10-21 07:49:14 -04:00
Kconfig block: Block layer data integrity support 2008-07-03 13:21:13 +02:00
Kconfig.iosched update I/O sched Kconfig help texts - CFQ is now default, not AS. 2007-02-17 20:08:22 +01:00
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 [PATCH] switch scsi_cmd_ioctl() to passing fmode_t 2008-10-21 07:47:14 -04:00