linux/block
Yasuaki Ishimatsu 5eb46851de cfq-iosched: fix cfq_cic_link() race confition
cfq_cic_link() has race condition. When some processes which shared ioc
issue I/O to same block device simultaneously, cfq_cic_link() returns -EEXIST
sometimes. The race condition might stop I/O by following steps:

step  1: Process A: Issue an I/O to /dev/sda
step  2: Process A: Get an ioc (iocA here) in get_io_context() which does not
		    linked with a cic for the device
step  3: Process A: Get a new cic for the device (cicA here) in
		    cfq_alloc_io_context()

step  4: Process B: Issue an I/O to /dev/sda
step  5: Process B: Get iocA in get_io_context() since process A and B share the
		    same ioc
step  6: Process B: Get a new cic for the device (cicB here) in
		    cfq_alloc_io_context() since iocA has not been linked with a
		    cic for the device yet

step  7: Process A: Link cicA to iocA in cfq_cic_link()
step  8: Process A: Dispatch I/O to driver and finish it

step  9: Process B: Try to link cicB to iocA in cfq_cic_link()
		    But it fails with showing "cfq: cic link failed!" kernel
		    message, since iocA has already linked with cicA at step 7.
step 10: Process B: Wait for finishig I/O in get_request_wait()
		    The function does not wake up, when there is no I/O to the
		    device.

When cfq_cic_link() returns -EEXIST, it means ioc has already linked with cic.
So when cfq_cic_link() return -EEXIST, retry cfq_cic_lookup().

Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: stable@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2011-12-02 10:07:07 +01:00
..
blk-cgroup.c blk-throttle: Take blkcg->lock while traversing blkcg->policy_list 2011-10-25 15:48:12 +02:00
blk-cgroup.h block: fix a typo in the blk-cgroup.h file 2011-10-24 16:08:38 +02:00
blk-core.c block: initialize request_queue's numa node during 2011-11-23 10:59:13 +01:00
blk-exec.c [SCSI] fix crash in scsi_dispatch_cmd() 2011-07-21 14:21:18 -07:00
blk-flush.c blk-flush: move the queue kick into 2011-10-24 16:24:31 +02:00
blk-integrity.c block: add export.h to files using EXPORT_SYMBOL/THIS_MODULE macros 2011-10-31 19:31:12 -04:00
blk-ioc.c Merge branch 'for-linus' into for-3.1/core 2011-07-01 16:17:13 +02:00
blk-iopoll.c
blk-lib.c block: fix patch import error in max_discard_sectors check 2011-07-23 20:34:59 +02:00
blk-map.c block: Always check length of all iov entries in blk_rq_map_user_iov() 2011-11-13 19:58:09 +01:00
blk-merge.c block: attempt to merge with existing requests on plug flush 2011-03-21 10:14:27 +01:00
blk-settings.c block: Fix discard topology stacking and reporting 2011-05-18 10:37:35 +02:00
blk-softirq.c block: Don't check QUEUE_FLAG_SAME_COMP in __blk_complete_request 2011-09-14 09:31:01 +02:00
blk-sysfs.c block: fix request_queue lifetime handling by making blk_queue_cleanup() properly shutdown 2011-10-19 14:42:16 +02:00
blk-tag.c block: warn if tag is greater than real_max_depth. 2011-10-25 10:20:05 +02:00
blk-throttle.c blk-throttle: use queue_is_locked() instead of lockdep_is_held() 2011-10-25 15:51:48 +02:00
blk-timeout.c fault-injection: add ability to export fault_attr in arbitrary directory 2011-08-03 14:25:20 -10:00
blk.h block: fix request_queue lifetime handling by making blk_queue_cleanup() properly shutdown 2011-10-19 14:42:16 +02:00
bsg-lib.c block: Change module.h -> export.h in bsg-lib.c 2011-10-31 19:31:13 -04:00
bsg.c bsg: fix address space warning from sparse 2011-06-20 13:27:45 +02:00
cfq-iosched.c cfq-iosched: fix cfq_cic_link() race confition 2011-12-02 10:07:07 +01:00
cfq.h
compat_ioctl.c compat_ioctl: fix warning caused by qemu 2011-07-01 22:32:26 +02:00
deadline-iosched.c iosched: prevent aliased requests from starving other I/O 2011-06-02 21:19:05 +02:00
elevator.c block: fix request_queue lifetime handling by making blk_queue_cleanup() properly shutdown 2011-10-19 14:42:16 +02:00
genhd.c block: Revert "[SCSI] genhd: add a new attribute "alias" in gendisk" 2011-11-10 09:03:55 +01:00
ioctl.c Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux 2011-11-06 19:44:47 -08:00
Kconfig block: add bsg helper library 2011-07-31 22:05:09 +02:00
Kconfig.iosched
Makefile block: add bsg helper library 2011-07-31 22:05:09 +02:00
noop-iosched.c
scsi_ioctl.c block: drop unnecessary blk_get/put_queue() in scsi_cmd_ioctl() and blk_get_tg() 2011-10-19 14:31:25 +02:00