[PATCH] pm-hibernate: flush block device cache when hibernating
Mikulas Patocka <[email protected]> Fri, 24 Oct 2025 12:23:20 +0200 (CEST)
| Newsgroups | dev.linux.lists.lvm-devel,dev.linux.lists.dm-devel,dev.linux.lists.linux-lvm,org.kernel.vger.linux-block,org.kernel.vger.linux-btrfs,org.kernel.vger.linux-crypto,org.kernel.vger.linux-pm,org.kernel.vger.linux-raid,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On Fri, 24 Oct 2025, Askar Safin wrote: > Hi. > > Hibernate to swap located on dm-integrity doesn't work. > Let me first describe why I need this, then I will describe a bug with steps > to reproduce > (and some speculation on cause of the bug). Hi Does this patch fix it? Mikulas From: Mikulas Patocka <[email protected]> There was reported failure that hibernation doesn't work with dm-integrity. The reason for the failure is that the hibernation code doesn't issue the FLUSH bio - the data still sits in the dm-integrity cache and they are lost when poweroff happens. This commit fixes the suspend code so that it issues flushes before writing the header and after writing the header. Signed-off-by: Mikulas Patocka <[email protected]> Reported-by: Askar Safin <[email protected]> Link: https://lore.kernel.org/dm-devel/[email protected]/T/ Cc: [email protected] --- kernel/power/swap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) Index: linux-2.6/kernel/power/swap.c =================================================================== --- linux-2.6.orig/kernel/power/swap.c 2025-10-13 21:42:48.000000000 +0200 +++ linux-2.6/kernel/power/swap.c 2025-10-24 12:01:32.000000000 +0200 @@ -320,8 +320,10 @@ static int mark_swapfiles(struct swap_ma swsusp_header->flags = flags; if (flags & SF_CRC32_MODE) swsusp_header->crc32 = handle->crc32; - error = hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC, + error = hib_submit_io_sync(REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH, swsusp_resume_block, swsusp_header); + if (!error) + error = blkdev_issue_flush(file_bdev(hib_resume_bdev_file)); } else { pr_err("Swap header not found!\n"); error = -ENODEV;