linux/drivers/ide
Tejun Heo dd8717da6d ide: clean up timed out request handling
8f6205cd57 introduced a bug where a
timed out DMA request is never requeued and lost.
6072f7491f fixed this by making
ide_dma_timeout_retry() requeue the request itself.  While the fix is
correct, it makes DMA and non-DMA paths asymmetric regarding how the
in flight request is requeued.

As long as hwif->rq is set, the IDE driver is assuming ownership of
the request and the request should either be completed or requeued
when clearing hwif->rq.  In the timeout path, the ide driver holds
onto the request as long as the recovery action (ie. reset) is in
progress and clears it after the state machine is stopped (ide_stopped
return), so the existing requeueing logic is correct.  The bug
occurred because ide_dma_timeout_retry() explicitly clears hwif->rq
without requeueing it.

ide_dma_timeout_retry() is called only by ide_timer_expiry() and
returns ide_started only when ide_error() would return it - ie. after
reset state machine has started in which case the state machine will
eventually end up executing the ide_stopped path in ide_timer_expiry()
after reset protocol is complete.  So, there is no need to clear
hwif->rq from ide_dma_timeout_retry().  ide_timer_expiry() will handle
it the same way as PIO timeout path.

Kill hwif->rq clearing and requeueing from ide_dma_timeout_retry() and
let ide_timer_expiry() deal with it.  The end result should remain the
same.

grepping shows ide_dma_timeout_retry() is the only site which clears
hwif->rq without taking care of the request, so there shouldn't be
similar fallouts.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2010-10-26 10:17:30 -07:00
..
aec62xx.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
ali14xx.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
alim15x3.c alim15x3: fix handling of UDMA enable bit 2010-01-19 01:52:31 -08:00
amd74xx.c amd74xx: use ->pio_mode value to determine pair device speed 2010-01-19 01:52:32 -08:00
at91_ide.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
atiixp.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
au1xxx-ide.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-next-2.6 2010-03-04 08:24:06 -08:00
buddha.c ide: move ack_intr() method into 'struct ide_port_ops' (take 2) 2009-06-15 18:52:58 +02:00
cmd64x.c cmd64x: fix handling of address setup timings 2010-01-19 01:52:32 -08:00
cmd640.c cmd640: fix kernel oops in test_irq() method 2010-05-11 00:08:03 -07:00
cs5520.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
cs5530.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
cs5535.c cs5535: use ->pio_mode value to determine pair device speed 2010-01-19 01:52:33 -08:00
cs5536.c cs5536: use ->pio_mode value to determine pair device speed 2010-01-19 01:52:33 -08:00
cy82c693.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
delkin_cb.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
dtc2278.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
falconide.c ide: move ack_intr() method into 'struct ide_port_ops' (take 2) 2009-06-15 18:52:58 +02:00
gayle.c m68k: amiga - Amiga Gayle IDE platform device conversion 2010-05-26 19:51:09 +02:00
hpt366.c hpt366: fix clock turnaround 2010-10-26 10:17:29 -07:00
ht6560b.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
icside.c Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ide-2.6 2010-03-02 23:57:59 -08:00
ide_platform.c IDE: pass IRQ flags to the IDE core 2010-04-15 14:20:53 -07:00
ide-4drives.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-acpi.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-atapi.c block: fix some more cmd_type cleanup fallout 2010-08-07 18:22:29 +02:00
ide-cd_ioctl.c block: unify flags for struct bio and struct request 2010-08-07 18:20:39 +02:00
ide-cd_verbose.c
ide-cd.c block: autoconvert trivial BKL users to private mutex 2010-10-05 15:01:10 +02:00
ide-cd.h ide-cd: convert to using generic sense request 2009-04-28 07:37:30 +02:00
ide-cs.c pcmcia: remove obsolete and wrong comments 2010-09-29 17:20:25 +02:00
ide-devsets.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-disk_ioctl.c block: autoconvert trivial BKL users to private mutex 2010-10-05 15:01:10 +02:00
ide-disk_proc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-disk.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2010-10-24 13:41:39 -07:00
ide-disk.h
ide-dma-sff.c ide: remove wmb() from ide-dma-sff.c and scc_pata.c 2009-04-08 14:12:49 +02:00
ide-dma.c ide: clean up timed out request handling 2010-10-26 10:17:30 -07:00
ide-eh.c block: remove wrappers for request type/flags 2010-08-07 18:17:56 +02:00
ide-floppy_ioctl.c block: autoconvert trivial BKL users to private mutex 2010-10-05 15:01:10 +02:00
ide-floppy_proc.c ide: convert to ->proc_fops 2009-09-01 17:52:57 -07:00
ide-floppy.c block: unify flags for struct bio and struct request 2010-08-07 18:20:39 +02:00
ide-floppy.h
ide-gd.c block: autoconvert trivial BKL users to private mutex 2010-10-05 15:01:10 +02:00
ide-gd.h ide: move ->failed_pc to ide_drive_t 2009-03-27 12:46:34 +01:00
ide-generic.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-h8300.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-io-std.c ide: refactor tf_read() method 2009-04-08 14:13:03 +02:00
ide-io.c ide: remove unnecessary blk_queue_flushing() test in do_ide_request() 2010-09-10 12:35:36 +02:00
ide-ioctls.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-iops.c ide: add SATA cable detection support 2010-01-19 01:41:57 -08:00
ide-legacy.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-lib.c Merge branch 'master' into for-2.6.31 2009-05-22 20:28:35 +02:00
ide-park.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-pci-generic.c pata_piccolo: Driver for old Toshiba chipsets 2009-12-03 14:35:31 -05:00
ide-pio-blacklist.c
ide-pm.c block: remove wrappers for request type/flags 2010-08-07 18:17:56 +02:00
ide-pnp.c ide: remove hw_regs_t typedef 2009-05-17 19:12:25 +02:00
ide-probe.c ide: Fix ordering of procfs registry. 2010-09-13 21:34:25 -07:00
ide-proc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
ide-scan-pci.c
ide-sysfs.c
ide-tape.c Merge branch 'llseek' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl 2010-10-22 10:52:56 -07:00
ide-taskfile.c drivers/ide: Use memdup_user 2010-08-09 03:17:53 -07:00
ide-timings.c ide: ide_timing_compute() fixup 2010-01-19 11:30:09 -08:00
ide-xfer-mode.c ide: make ide_get_best_pio_mode() static 2010-01-19 01:52:36 -08:00
ide.c ide: use module_param_named rather than module_param_call 2010-08-11 23:04:39 +09:30
it821x.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
it8172.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
it8213.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
jmicron.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
Kconfig ide: update Kconfig text to mark as deprecated 2009-10-29 03:09:26 -07:00
macide.c ide: move ack_intr() method into 'struct ide_port_ops' (take 2) 2009-06-15 18:52:58 +02:00
Makefile ide: merge ide_arm and ide_generic host drivers 2009-03-31 20:15:24 +02:00
ns87415.c ide: refactor tf_read() method 2009-04-08 14:13:03 +02:00
opti621.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
palm_bk3710.c palm_bk3710: use ->pio_mode value to determine pair device speed 2010-01-19 01:52:34 -08:00
pdc202xx_new.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
pdc202xx_old.c pdc202xx_old: ignore "FIFO empty" bit in test_irq() method 2010-04-22 19:11:24 -07:00
piix.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
pmac.c powerpc/macio: Fix probing of macio devices by using the right of match table 2010-06-02 17:50:38 +10:00
q40ide.c ide: move ack_intr() method into 'struct ide_port_ops' (take 2) 2009-06-15 18:52:58 +02:00
qd65xx.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
qd65xx.h ide: do not access ide_drive_t 'drive_data' field directly 2009-06-15 22:13:44 +02:00
rapide.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
rz1000.c
sc1200.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
scc_pata.c Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/ide-2.6 2010-03-02 23:57:59 -08:00
serverworks.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
setup-pci.c ide: re-implement ide_pci_init_one() on top of ide_pci_init_two() 2009-06-10 14:37:21 +02:00
sgiioc4.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
siimage.c siimage: use ->pio_mode value to determine pair device speed 2010-01-19 01:52:35 -08:00
sis5513.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
sl82c105.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
slc90e66.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
tc86c001.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
triflex.c ide: change ->set_dma_mode method parameters 2010-01-19 01:45:29 -08:00
trm290.c ide: turn selectproc() method into dev_select() method (take 5) 2009-03-31 20:15:32 +02:00
tx4938ide.c tx493xide: use min_t() macro instead of min() 2010-08-09 03:17:55 -07:00
tx4939ide.c tx493xide: use min_t() macro instead of min() 2010-08-09 03:17:55 -07:00
umc8672.c ide: change ->set_pio_mode method parameters 2010-01-19 01:44:41 -08:00
via82cxxx.c via82cxxx: fix typo for VT6415 PCIE PATA IDE Host Controller support. 2010-08-09 03:17:51 -07:00