Skip to content

Commit a452744

Browse files
Mikulas PatockaNeilBrown
Mikulas Patocka
authored and
NeilBrown
committed
crash in md-raid1 and md-raid10 due to incorrect list manipulation
The commit 55ce74d (md/raid1: ensure device failure recorded before write request returns) is causing crash in the LVM2 testsuite test shell/lvchange-raid.sh. For me the crash is 100% reproducible. The reason for the crash is that the newly added code in raid1d moves the list from conf->bio_end_io_list to tmp, then tests if tmp is non-empty and then incorrectly pops the bio from conf->bio_end_io_list (which is empty because the list was alrady moved). Raid-10 has a similar bug. Kernel Fault: Code=15 regs=000000006ccb8640 (Addr=0000000100000000) CPU: 3 PID: 1930 Comm: mdX_raid1 Not tainted 4.2.0-rc5-bisect+ #35 task: 000000006cc1f258 ti: 000000006ccb8000 task.ti: 000000006ccb8000 YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI PSW: 00001000000001001111111000001111 Not tainted r00-03 000000ff0804fe0f 000000001059d000 000000001059f818 000000007f16be38 r04-07 000000001059d000 000000007f16be08 0000000000200200 0000000000000001 r08-11 000000006ccb8260 000000007b7934d0 0000000000000001 0000000000000000 r12-15 000000004056f320 0000000000000000 0000000000013dd0 0000000000000000 r16-19 00000000f0d00ae0 0000000000000000 0000000000000000 0000000000000001 r20-23 000000000800000f 0000000042200390 0000000000000000 0000000000000000 r24-27 0000000000000001 000000000800000f 000000007f16be08 000000001059d000 r28-31 0000000100000000 000000006ccb8560 000000006ccb8640 0000000000000000 sr00-03 0000000000249800 0000000000000000 0000000000000000 0000000000249800 sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000 IASQ: 0000000000000000 0000000000000000 IAOQ: 000000001059f61c 000000001059f620 IIR: 0f8010c6 ISR: 0000000000000000 IOR: 0000000100000000 CPU: 3 CR30: 000000006ccb8000 CR31: 0000000000000000 ORIG_R28: 000000001059d000 IAOQ[0]: call_bio_endio+0x34/0x1a8 [raid1] IAOQ[1]: call_bio_endio+0x38/0x1a8 [raid1] RP(r2): raid_end_bio_io+0x88/0x168 [raid1] Backtrace: [<000000001059f818>] raid_end_bio_io+0x88/0x168 [raid1] [<00000000105a4f64>] raid1d+0x144/0x1640 [raid1] [<000000004017fd5c>] kthread+0x144/0x160 Signed-off-by: Mikulas Patocka <[email protected]> Fixes: 55ce74d ("md/raid1: ensure device failure recorded before write request returns.") Fixes: 95af587 ("md/raid10: ensure device failure recorded before write request returns.") Signed-off-by: NeilBrown <[email protected]>
1 parent da6fb7a commit a452744

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

drivers/md/raid1.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,8 +2382,8 @@ static void raid1d(struct md_thread *thread)
23822382
}
23832383
spin_unlock_irqrestore(&conf->device_lock, flags);
23842384
while (!list_empty(&tmp)) {
2385-
r1_bio = list_first_entry(&conf->bio_end_io_list,
2386-
struct r1bio, retry_list);
2385+
r1_bio = list_first_entry(&tmp, struct r1bio,
2386+
retry_list);
23872387
list_del(&r1_bio->retry_list);
23882388
raid_end_bio_io(r1_bio);
23892389
}

drivers/md/raid10.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,8 +2688,8 @@ static void raid10d(struct md_thread *thread)
26882688
}
26892689
spin_unlock_irqrestore(&conf->device_lock, flags);
26902690
while (!list_empty(&tmp)) {
2691-
r10_bio = list_first_entry(&conf->bio_end_io_list,
2692-
struct r10bio, retry_list);
2691+
r10_bio = list_first_entry(&tmp, struct r10bio,
2692+
retry_list);
26932693
list_del(&r10_bio->retry_list);
26942694
raid_end_bio_io(r10_bio);
26952695
}

0 commit comments

Comments
 (0)