3.4.4: suspend oops, resume crash

Nix <[email protected]> Mon, 25 Jun 2012 22:17:20 +0100
Newsgroups gmane.linux.swsusp.devel
Message-ID <[email protected]>
(3.4.4 derived from Nigel's 3.4.3 git merged with upstream 3.4.4.)

This crash, caused by md finishing up in its reboot notifier, is still
present:

[  296.177108] kernel BUG at block/blk-core.c:1704!
[  296.177141] invalid opcode: 0000 [#1] PREEMPT SMP 
[  296.177173] CPU 0 
[  296.177183] Modules linked in: firewire_ohci firewire_core [last unloaded: microcode] 
[  296.177230] 
[  296.177239] Pid: 4109, comm: hibernate Not tainted 3.4.4-05172-gb169281-dirty #1 System manufacturer System Product Name /P6T 
[  296.177301] RIP: 0010:[<ffffffff812583ee>] [<ffffffff812583ee>] submit_bio+0x33/0xf6
[  296.177346] RSP: 0018:ffff8802b06e1b48  EFLAGS: 00010246
[  296.177373] RAX: 0000000000000e11 RBX: ffff88032e207848 RCX: 0000000000000400
[  296.177408] RDX: 00000000000000a8 RSI: ffff88032e207848 RDI: 0000000000000e11
[  296.177444] RBP: ffff8802b06e1b98 R08: 0000000000000000 R09: ffff88032e207848
[  296.177479] R10: 0000000000000002 R11: ffff88032cfba800 R12: ffff88032d453800
[  296.177515] R13: 0000000000000008 R14: ffff88032e207848 R15: 0000000000000400
[  296.177550] FS:  00007fb08ddd9700(0000) GS:ffff88033fc00000(0000) knlGS:0000000000000000
[  296.177591] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[  296.177619] CR2: ffffffffff600400 CR3: 00000002b6840000 CR4: 00000000000007f0
[  296.177654] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  296.177690] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[  296.177725] Process hibernate (pid: 4109, threadinfo ffff8802b06e0000, task ffff8802bb6f9660)
[  296.177766] Stack:
[  296.177777]  ffffffff810ef614 ffff88032cfba800 ffff88032d453800 ffff88032cfba800 
[  296.177819]  ffff88032d453800 0000000000000008 ffff88032e207848 ffff88032cfba800 
[  296.177863]  ffff88032d453800 0000000000000008 ffff8802b06e1be8 ffffffff814505f6 
[  296.177970] Call Trace:
[  296.177986]  [<ffffffff810ef614>] ? __lock_page+0x68/0x68
[  296.178016]  [<ffffffff814505f6>] md_super_write+0x85/0x94
[  296.178046]  [<ffffffff81450990>] md_update_sb+0x306/0x465
[  296.178075]  [<ffffffff81079491>] ? abort_exclusive_wait+0x8e/0x8e
[  296.178107]  [<ffffffff814515c5>] __md_stop_writes+0x71/0x75
[  296.178137]  [<ffffffff814516e8>] md_notify_reboot+0x54/0xd7
[  296.178168]  [<ffffffff8107d87b>] notifier_call_chain+0x37/0x63
[  296.178198]  [<ffffffff8107d9b6>] __blocking_notifier_call_chain+0x4b/0x60
[  296.178233]  [<ffffffff8107d9df>] blocking_notifier_call_chain+0x14/0x16
[  296.178268]  [<ffffffff8106fa9b>] kernel_restart_prepare+0x1d/0x3d
[  296.178299]  [<ffffffff8106facf>] kernel_restart+0x14/0x51
[  296.178328]  [<ffffffff81098b05>] __toi_power_down+0x5e/0x130
[  296.178358]  [<ffffffff81098e6d>] toi_power_down+0x8b/0x92
[  296.178387]  [<ffffffff810a2810>] ? memory_bm_next_pfn+0x10/0x12
[  296.178419]  [<ffffffff81092b0b>] ? map_ps2_pages+0x15/0x1c
[  296.178447]  [<ffffffff8109331e>] do_toi_step+0x5c5/0x6b6
[  296.178475]  [<ffffffff81093736>] toi_try_hibernate+0x102/0x13e
[  296.179842]  [<ffffffff81091f6a>] toi_main_wrapper+0xe/0x10
[  296.181252]  [<ffffffff81092184>] toi_attr_store+0x208/0x255
[  296.182674]  [<ffffffff8118baf2>] sysfs_write_file+0xf4/0x130
[  296.184116]  [<ffffffff811307f5>] vfs_write+0xb2/0x142
[  296.185577]  [<ffffffff81130a7f>] sys_write+0x4a/0x71
[  296.187057]  [<ffffffff815ae2e2>] system_call_fastpath+0x16/0x1b
[  296.188557] Code: 53 48 83 ec 38 66 66 66 66 90 48 63 c7 48 89 f3 8b
4e 30 48 0b 46 20 83 3d c7 01 aa 00 00 48 89 46 20 74 09 a9 00 00 00 20
75 02 <0f> 0b 48 85 db 0f 84 a5 00 00 00 48 83 7b 48 00 0f 84 9a 00 00
[  296.192241] RIP [<ffffffff812583ee>] submit_bio+0x33/0xf6
[  296.194076]  RSP <ffff8802b06e1b48>
[  296.195953] ---[ end trace 261f90088192c622 ]---

Fix the same as in 3.3:

Index: linux/drivers/md/md.c
===================================================================
--- linux.orig/drivers/md/md.c	2012-06-25 04:43:15.793300371 +0100
+++ linux/drivers/md/md.c	2012-06-25 22:05:40.009727413 +0100
@@ -853,7 +853,7 @@
 	bio->bi_end_io = super_written;
 
 	atomic_inc(&mddev->pending_writes);
-	submit_bio(WRITE_FLUSH_FUA, bio);
+	submit_bio(WRITE_FLUSH_FUA | REQ_TOI, bio);
 }
 
 void md_super_wait(struct mddev *mddev)