[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;