android_kernel_xiaomi_sm8350/drivers
K.Tanaka a07e6ab41b md: the md RAID10 resync thread could cause a md RAID10 array deadlock
This message describes another issue about md RAID10 found by testing the
2.6.24 md RAID10 using new scsi fault injection framework.

Abstract:

When a scsi error results in disabling a disk during RAID10 recovery, the
resync threads of md RAID10 could stall.

This case, the raid array has already been broken and it may not matter.  But
I think stall is not preferable.  If it occurs, even shutdown or reboot will
fail because of resource busy.

The deadlock mechanism:

The r10bio_s structure has a "remaining" member to keep track of BIOs yet to
be handled when recovering.  The "remaining" counter is incremented when
building a BIO in sync_request() and is decremented when finish a BIO in
end_sync_write().

If building a BIO fails for some reasons in sync_request(), the "remaining"
should be decremented if it has already been incremented.  I found a case
where this decrement is forgotten.  This causes a md_do_sync() deadlock
because md_do_sync() waits for md_done_sync() called by end_sync_write(), but
end_sync_write() never calls md_done_sync() because of the "remaining" counter
mismatch.

For example, this problem would be reproduced in the following case:

Personalities : [raid10]
md0 : active raid10 sdf1[4] sde1[5](F) sdd1[2] sdc1[1] sdb1[6](F)
      3919616 blocks 64K chunks 2 near-copies [4/2] [_UU_]
      [>....................]  recovery =  2.2% (45376/1959808) finish=0.7min speed=45376K/sec

This case, sdf1 is recovering, sdb1 and sde1 are disabled.
An additional error with detaching sdd will cause a deadlock.

md0 : active raid10 sdf1[4] sde1[5](F) sdd1[6](F) sdc1[1] sdb1[7](F)
      3919616 blocks 64K chunks 2 near-copies [4/1] [_U__]
      [=>...................]  recovery =  5.0% (99520/1959808) finish=5.9min speed=5237K/sec

 2739 ?        S<     0:17 [md0_raid10]
28608 ?        D<     0:00 [md0_resync]
28629 pts/1    Ss     0:00 bash
28830 pts/1    R+     0:00 ps ax
31819 ?        D<     0:00 [kjournald]

The resync thread keeps working, but actually it is deadlocked.

Patch:
By this patch, the remaining counter will be decremented if needed.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-03-04 16:35:18 -08:00
..
acorn/char Fix default compose table initialization 2008-03-03 14:53:16 -08:00
acpi Merge branches 'release', 'bugzilla-9916', 'bugzilla-9982', 'bugzilla-9989', 'misc', 'suspend', 'thermal', 'thinkpad' and 'tsc' into release 2008-02-21 02:41:58 -05:00
amba
ata block: separate out padding from alignment 2008-03-04 11:18:17 +01:00
atm
auxdisplay
base docbook: fix kernel-api source files 2008-03-03 10:47:14 -08:00
block pktcdvd: reduce stack consumption 2008-03-04 16:35:12 -08:00
bluetooth
cdrom make cdrom.c:check_for_audio_disc() static 2008-03-04 11:28:41 +01:00
char drivers/char/isicom.c: correct use of ! and & 2008-03-04 16:35:15 -08:00
clocksource
connector CONNECTOR: make cn_already_initialized static 2008-02-26 18:42:44 -08:00
cpufreq cpufreq: fix kobject reference count handling 2008-02-21 15:27:06 -08:00
cpuidle
crypto
dca
dio
dma ioat: fix 'ack' handling, driver must ensure that 'ack' is zero 2008-03-04 10:16:46 -07:00
edac
eisa
firewire firewire: fix crash in automatic module unloading 2008-03-02 12:35:46 +01:00
firmware dmi: prevent linked list corruption 2008-02-23 17:12:15 -08:00
gpio
hid
hwmon hwmon: normal_i2c arrays should be const 2008-02-18 21:58:15 -05:00
i2c i2c-i801: Add support for the ICH10 2008-02-24 20:03:42 +01:00
ide ide: remove stale comments from ide-dma.c (take 2) 2008-02-26 21:50:36 +01:00
ieee1394 ieee1394: sbp2: fix rescan-scsi-bus 2008-02-19 19:57:24 +01:00
infiniband RDMA/nes: Fix interrupt moderation low threshold 2008-02-26 16:24:29 -08:00
input
isdn hisax_fcpcipnp: move request_irq later in probe 2008-03-04 16:35:16 -08:00
leds
lguest
macintosh PM: Introduce PM_EVENT_HIBERNATE callback state 2008-02-23 10:40:04 -08:00
mca
md md: the md RAID10 resync thread could cause a md RAID10 array deadlock 2008-03-04 16:35:18 -08:00
media V4L/DVB (7219): zoran: Fix namespace conflicts with Zoran 'GPIO_MAX' enum 2008-02-18 12:18:28 -03:00
memstick
message docbook: fix fusion source files 2008-03-03 10:47:14 -08:00
mfd sm501: add support for the SM502 programmable PLL 2008-03-04 16:35:13 -08:00
misc ACPI: thinkpad-acpi: fix hotkey_get_tablet_mode 2008-03-04 16:35:16 -08:00
mmc
mtd
net m68knommu: fix fec driver interrupt races 2008-03-04 08:04:11 -08:00
nubus
of
oprofile
parisc iommu: parisc: make the IOMMUs respect the segment boundary limits 2008-03-04 16:35:17 -08:00
parport
pci docbook: fix kernel-api source files 2008-03-03 10:47:14 -08:00
pcmcia PCI: drivers/pcmcia/i82092.c: fix up after pci_bus_region changes 2008-02-21 15:34:35 -08:00
pnp
power
ps3
rapidio docbook: fix rapidio source files 2008-03-03 10:47:13 -08:00
rtc rtc: add support for the S-35390A RTC chip 2008-03-04 16:35:09 -08:00
s390 Build fix for drivers/s390/char/defkeymap.c 2008-03-04 08:01:26 -08:00
sbus
scsi scsi: missing add of padded bytes to io completion byte count 2008-03-04 20:24:05 +01:00
serial drivers/serial/m32r_sio.c: correct use of ! and & 2008-03-04 16:35:16 -08:00
sh maple: fix device detection 2008-02-26 14:12:09 +09:00
sn
spi powerpc: mpc5200: fix build error on mpc52xx_psc_spi device driver 2008-03-04 16:35:12 -08:00
ssb SSB PCI core driver: use new SPROM data structure 2008-02-28 09:29:58 -05:00
tc
telephony
thermal thermal: use ERR_PTR for returning error 2008-02-15 18:21:30 -05:00
uio UIO: fix Greg's stupid changes 2008-02-21 15:27:07 -08:00
usb docbook: fix usb source files 2008-03-03 10:47:14 -08:00
video sm501fb: fix timing limits 2008-03-04 16:35:13 -08:00
virtio
w1 ds1wm: report bus reset error 2008-03-04 16:35:12 -08:00
watchdog [WATCHDOG] HP ProLiant WatchDog driver 2008-02-18 17:06:21 +00:00
xen
zorro
Kconfig
Makefile