All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: mcgrof@kernel.org, jack@suse.cz, hch@infradead.org,
	david@fromorbit.com, rafael@kernel.org, djwong@kernel.org,
	pavel@kernel.org, peterz@infradead.org, mingo@redhat.com,
	will@kernel.org, boqun.feng@gmail.com
Subject: [RFC PATCH 4/4] vfs: add filesystem freeze/thaw callbacks for power management
Date: Thu, 27 Mar 2025 10:06:13 -0400	[thread overview]
Message-ID: <20250327140613.25178-5-James.Bottomley@HansenPartnership.com> (raw)
In-Reply-To: <20250327140613.25178-1-James.Bottomley@HansenPartnership.com>

Introduce a freeze function, which iterates superblocks in reverse
order freezing filesystems.  The indicator a filesystem is freezable
is either possessing a s_bdev or a freeze_super method.  So this can
be used in efivarfs, whether the freeze is for hibernate is also
passed in via the new FREEZE_FOR_HIBERNATE flag.

Thawing is done opposite to freezing (so superblock traversal in
regular order) and the whole thing is plumbed into power management.
The original ksys_sync() is preserved so the whole freezing step is
optional (if it fails we're no worse off than we are today) so it
doesn't inhibit suspend/hibernate if there's a failure.

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
---
 fs/super.c               | 61 ++++++++++++++++++++++++++++++++++++++++
 include/linux/fs.h       |  5 ++++
 kernel/power/hibernate.c | 12 ++++++++
 kernel/power/suspend.c   |  4 +++
 4 files changed, 82 insertions(+)

diff --git a/fs/super.c b/fs/super.c
index 76785509d906..b4b0986414b0 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1461,6 +1461,67 @@ static struct super_block *get_bdev_super(struct block_device *bdev)
 	return sb;
 }
 
+/*
+ * Kernel freezing and thawing is only done in the power management
+ * subsystem and is thus single threaded (so we don't have to worry
+ * here about multiple calls to filesystems_freeze/thaw().
+ */
+
+static int freeze_flags;
+
+static void filesystems_freeze_callback(struct super_block *sb)
+{
+	/* errors don't fail suspend so ignore them */
+	if (sb->s_op->freeze_super)
+		sb->s_op->freeze_super(sb, FREEZE_MAY_NEST
+				       | FREEZE_HOLDER_KERNEL
+				       | freeze_flags);
+	else if (sb->s_bdev)
+		freeze_super(sb, FREEZE_MAY_NEST | FREEZE_HOLDER_KERNEL
+			     | freeze_flags);
+	else {
+		pr_info("Ignoring filesystem %s\n", sb->s_type->name);
+		return;
+	}
+
+	pr_info("frozen %s, now syncing block ...", sb->s_type->name);
+	sync_blockdev(sb->s_bdev);
+	pr_info("done.");
+}
+
+/**
+ * filesystems_freeze - freeze callback for power management
+ *
+ * Freeze all active filesystems (in reverse superblock order)
+ */
+void filesystems_freeze(bool for_hibernate)
+{
+	freeze_flags = for_hibernate ? FREEZE_FOR_HIBERNATE : 0;
+	__iterate_supers_rev(filesystems_freeze_callback);
+}
+
+static void filesystems_thaw_callback(struct super_block *sb)
+{
+	if (sb->s_op->thaw_super)
+		sb->s_op->thaw_super(sb, FREEZE_MAY_NEST
+				     | FREEZE_HOLDER_KERNEL
+				     | freeze_flags);
+	else if (sb->s_bdev)
+		thaw_super(sb,	FREEZE_MAY_NEST | FREEZE_HOLDER_KERNEL
+			   | freeze_flags);
+}
+
+/**
+ * filesystems_thaw - thaw callback for power management
+ *
+ * Thaw all active filesystems (in forward superblock order)
+ */
+void filesystems_thaw(bool for_hibernate)
+{
+	freeze_flags = for_hibernate ? FREEZE_FOR_HIBERNATE : 0;
+	__iterate_supers(filesystems_thaw_callback);
+}
+
 /**
  * fs_bdev_freeze - freeze owning filesystem of block device
  * @bdev: block device
diff --git a/include/linux/fs.h b/include/linux/fs.h
index cbbb704eff74..de154e9379ec 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2272,6 +2272,7 @@ extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
  * @FREEZE_HOLDER_KERNEL: kernel wants to freeze or thaw filesystem
  * @FREEZE_HOLDER_USERSPACE: userspace wants to freeze or thaw filesystem
  * @FREEZE_MAY_NEST: whether nesting freeze and thaw requests is allowed
+ * @FREEZE_FOR_HIBERNATE: set if freeze is from power management hibernate
  *
  * Indicate who the owner of the freeze or thaw request is and whether
  * the freeze needs to be exclusive or can nest.
@@ -2285,6 +2286,7 @@ enum freeze_holder {
 	FREEZE_HOLDER_KERNEL	= (1U << 0),
 	FREEZE_HOLDER_USERSPACE	= (1U << 1),
 	FREEZE_MAY_NEST		= (1U << 2),
+	FREEZE_FOR_HIBERNATE	= (1U << 3),
 };
 
 struct super_operations {
@@ -3919,4 +3921,7 @@ static inline bool vfs_empty_path(int dfd, const char __user *path)
 
 int generic_atomic_write_valid(struct kiocb *iocb, struct iov_iter *iter);
 
+void filesystems_freeze(bool for_hibernate);
+void filesystems_thaw(bool for_hibernate);
+
 #endif /* _LINUX_FS_H */
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 10a01af63a80..fc2106e6685a 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -778,7 +778,12 @@ int hibernate(void)
 
 	ksys_sync_helper();
 
+	pr_info("about to freeze filesystems\n");
+	filesystems_freeze(true);
+	pr_info("filesystem freeze done\n");
+
 	error = freeze_processes();
+	pr_info("process freeze done\n");
 	if (error)
 		goto Exit;
 
@@ -788,7 +793,9 @@ int hibernate(void)
 	if (error)
 		goto Thaw;
 
+	pr_info("About to create snapshot\n");
 	error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM);
+	pr_info("snapshot done\n");
 	if (error || freezer_test_done)
 		goto Free_bitmaps;
 
@@ -842,6 +849,8 @@ int hibernate(void)
 	}
 	thaw_processes();
 
+	filesystems_thaw(true);
+
 	/* Don't bother checking whether freezer_test_done is true */
 	freezer_test_done = false;
  Exit:
@@ -939,6 +948,8 @@ int hibernate_quiet_exec(int (*func)(void *data), void *data)
 
 	thaw_processes();
 
+	filesystems_thaw(true);
+
 exit:
 	pm_notifier_call_chain(PM_POST_HIBERNATION);
 
@@ -1041,6 +1052,7 @@ static int software_resume(void)
 
 	error = load_image_and_restore();
 	thaw_processes();
+	filesystems_thaw(true);
  Finish:
 	pm_notifier_call_chain(PM_POST_RESTORE);
  Restore:
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 09f8397bae15..34cc5b0c408c 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -544,6 +544,7 @@ int suspend_devices_and_enter(suspend_state_t state)
 static void suspend_finish(void)
 {
 	suspend_thaw_processes();
+	filesystems_thaw(false);
 	pm_notifier_call_chain(PM_POST_SUSPEND);
 	pm_restore_console();
 }
@@ -581,6 +582,7 @@ static int enter_state(suspend_state_t state)
 		trace_suspend_resume(TPS("sync_filesystems"), 0, true);
 		ksys_sync_helper();
 		trace_suspend_resume(TPS("sync_filesystems"), 0, false);
+		filesystems_freeze(false);
 	}
 
 	pm_pr_dbg("Preparing system for sleep (%s)\n", mem_sleep_labels[state]);
@@ -603,6 +605,8 @@ static int enter_state(suspend_state_t state)
 	pm_pr_dbg("Finishing wakeup.\n");
 	suspend_finish();
  Unlock:
+	if (sync_on_suspend_enabled)
+		filesystems_thaw(false);
 	mutex_unlock(&system_transition_mutex);
 	return error;
 }
-- 
2.43.0


  parent reply	other threads:[~2025-03-27 14:18 UTC|newest]

Thread overview: 121+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-27 14:06 [RFC PATCH 0/4] vfs freeze/thaw on suspend/resume James Bottomley
2025-03-27 14:06 ` [RFC PATCH 1/4] locking/percpu-rwsem: add freezable alternative to down_read James Bottomley
2025-03-31 19:51   ` James Bottomley
2025-03-31 23:32     ` Christian Brauner
2025-04-01  1:13       ` James Bottomley
2025-04-01 11:20         ` Jan Kara
2025-04-01 12:50           ` Christian Brauner
2025-04-01 12:52           ` James Bottomley
2025-04-02 11:47             ` Jan Kara
2025-03-27 14:06 ` [RFC PATCH 2/4] vfs: make sb_start_write freezable James Bottomley
2025-03-27 17:36   ` Jan Kara
2025-03-27 14:06 ` [RFC PATCH 3/4] fs/super.c: introduce reverse superblock iterator and use it in emergency remount James Bottomley
2025-03-28 11:56   ` Christian Brauner
2025-03-28 12:38     ` James Bottomley
2025-03-28 16:15     ` [PATCH 0/6] Extend freeze support to suspend and hibernate Christian Brauner
2025-03-28 16:15       ` [PATCH 1/6] super: remove pointless s_root checks Christian Brauner
2025-03-28 16:15       ` [PATCH 2/6] super: simplify user_get_super() Christian Brauner
2025-03-28 16:15       ` [PATCH 3/6] super: skip dying superblocks early Christian Brauner
2025-03-28 16:15       ` [PATCH 4/6] super: use a common iterator (Part 1) Christian Brauner
2025-03-28 16:15       ` [PATCH 5/6] super: use common iterator (Part 2) Christian Brauner
2025-03-28 18:58         ` James Bottomley
2025-03-29  7:34           ` Christian Brauner
2025-03-28 16:15       ` [PATCH 6/6] super: add filesystem freezing helpers for suspend and hibernate Christian Brauner
2025-03-29  8:42       ` [PATCH v2 0/6] Extend freeze support to " Christian Brauner
2025-03-29  8:42         ` [PATCH v2 1/6] super: remove pointless s_root checks Christian Brauner
2025-03-31  9:57           ` Jan Kara
2025-06-11 16:26           ` Darrick J. Wong
2025-06-12 12:20             ` Christian Brauner
2025-03-29  8:42         ` [PATCH v2 2/6] super: simplify user_get_super() Christian Brauner
2025-03-31  9:58           ` Jan Kara
2025-03-29  8:42         ` [PATCH v2 3/6] super: skip dying superblocks early Christian Brauner
2025-03-31 10:00           ` Jan Kara
2025-03-29  8:42         ` [PATCH v2 4/6] super: use a common iterator (Part 1) Christian Brauner
2025-03-31 10:01           ` Jan Kara
2025-03-29  8:42         ` [PATCH v2 5/6] super: use common iterator (Part 2) Christian Brauner
2025-03-31 10:07           ` Jan Kara
2025-03-31 10:15             ` Christian Brauner
2025-03-29  8:42         ` [PATCH v2 6/6] super: add filesystem freezing helpers for suspend and hibernate Christian Brauner
2025-03-29  8:46           ` Christian Brauner
2025-03-29 11:30           ` kernel test robot
2025-03-31 10:23           ` Jan Kara
2025-03-31 10:25             ` Christian Brauner
2025-03-29 14:04         ` [PATCH v2 0/6] Extend freeze support to " James Bottomley
2025-03-29 17:02           ` James Bottomley
2025-03-30  8:33             ` Christian Brauner
2025-03-30 11:53               ` Christian Brauner
2025-03-30 14:00               ` James Bottomley
2025-03-31  9:13                 ` Christian Brauner
2025-03-31 10:36             ` Jan Kara
2025-03-31 14:49               ` James Bottomley
2025-03-31 23:33               ` Christian Brauner
2025-03-31 12:42         ` [PATCH 0/2] efivarfs: support freeze/thaw Christian Brauner
2025-03-31 12:42           ` [PATCH 1/2] libfs: export find_next_child() Christian Brauner
2025-03-31 12:42           ` [PATCH 2/2] efivarfs: support freeze/thaw Christian Brauner
2025-03-31 14:46             ` James Bottomley
2025-03-31 15:03               ` Christian Brauner
2025-04-01 19:31             ` James Bottomley
2025-04-02  7:44               ` Christian Brauner
2025-03-31 14:05           ` [PATCH 0/2] " Ard Biesheuvel
2025-04-01  0:32           ` [PATCH 0/6] power: wire-up filesystem freeze/thaw with suspend/resume Christian Brauner
2025-04-01  0:32             ` [PATCH 1/6] ext4: replace kthread freezing with auto fs freezing Christian Brauner
2025-04-01  9:16               ` Jan Kara
2025-04-01  9:35                 ` Christian Brauner
2025-04-01 10:08                   ` Jan Kara
2025-04-01  0:32             ` [PATCH 2/6] btrfs: " Christian Brauner
2025-04-01  0:32             ` [PATCH 3/6] xfs: " Christian Brauner
2025-04-01  1:11               ` Dave Chinner
2025-04-01  7:17                 ` Christian Brauner
2025-04-01 11:35                   ` Dave Chinner
2025-04-01 12:45                     ` Christian Brauner
2025-04-01  0:32             ` [PATCH 4/6] fs: add owner of freeze/thaw Christian Brauner
2025-04-01  0:32             ` [PATCH 5/6] fs: allow pagefault based writers to be frozen Christian Brauner
2025-04-01  0:32             ` [PATCH 6/6] power: freeze filesystems during suspend/resume Christian Brauner
2025-04-01  8:16             ` [PATCH 0/6] power: wire-up filesystem freeze/thaw with suspend/resume Christian Brauner
2025-04-01  9:32             ` Jan Kara
2025-04-01 13:03               ` Christian Brauner
2025-04-01 16:57                 ` Jan Kara
2025-04-02 14:07                   ` [PATCH v2 0/4] " Christian Brauner
2025-04-02 14:07                     ` [PATCH v2 1/4] fs: add owner of freeze/thaw Christian Brauner
2025-04-03 14:56                       ` Jan Kara
2025-04-03 19:33                         ` Christian Brauner
2025-04-04 10:24                         ` [PATCH] fs: allow nesting with FREEZE_EXCL Christian Brauner
2025-04-07  9:08                           ` Christoph Hellwig
2025-05-07 11:18                           ` Jan Kara
2025-05-09 10:38                             ` Christian Brauner
2025-04-02 14:07                     ` [PATCH v2 2/4] fs: allow all writers to be frozen Christian Brauner
2025-04-02 15:32                       ` Christian Brauner
2025-04-02 16:03                         ` James Bottomley
2025-04-02 16:13                           ` Christian Brauner
2025-04-03 14:59                       ` Jan Kara
2025-04-02 14:07                     ` [PATCH v2 3/4] power: freeze filesystems during suspend/resume Christian Brauner
2025-04-03 16:29                       ` Jan Kara
2025-04-02 14:07                     ` [PATCH v2 4/4] kernfs: add warning about implementing freeze/thaw Christian Brauner
2025-04-03 15:00                       ` Jan Kara
2025-07-20 19:23                     ` [PATCH v2 0/4] power: wire-up filesystem freeze/thaw with suspend/resume Askar Safin
2025-07-21 12:09                       ` Jan Kara
2025-08-04  5:31                         ` Miklos Szeredi
2025-08-04  6:02                           ` Askar Safin
2025-08-04  6:51                             ` Sergey Senozhatsky
2025-04-01 14:14             ` [PATCH 0/6] " Peter Zijlstra
2025-04-01 14:40               ` Christian Brauner
2025-04-01 14:59                 ` Peter Zijlstra
2025-04-01 17:02             ` James Bottomley
2025-04-02  7:46               ` Christian Brauner
2025-04-08 15:43                 ` James Bottomley
2025-04-08 17:09                   ` Luis Chamberlain
2025-04-08 17:20                     ` Luis Chamberlain
2025-04-08 17:26                       ` James Bottomley
2025-04-08 17:24                     ` James Bottomley
2025-04-09  7:17                   ` Christian Brauner
2025-03-27 14:06 ` James Bottomley [this message]
2025-03-27 18:20   ` [RFC PATCH 4/4] vfs: add filesystem freeze/thaw callbacks for power management Jan Kara
2025-03-28 14:21     ` James Bottomley
2025-03-28 14:36       ` James Bottomley
2025-03-28 10:08   ` Christian Brauner
2025-03-28 14:14     ` James Bottomley
2025-03-28 15:52       ` Christian Brauner
2025-03-28 16:15         ` James Bottomley
2025-03-29  8:23           ` Christian Brauner
2025-03-28 12:01   ` Christian Brauner
2025-03-28 14:40     ` James Bottomley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250327140613.25178-5-James.Bottomley@HansenPartnership.com \
    --to=james.bottomley@hansenpartnership.com \
    --cc=boqun.feng@gmail.com \
    --cc=david@fromorbit.com \
    --cc=djwong@kernel.org \
    --cc=hch@infradead.org \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=mingo@redhat.com \
    --cc=pavel@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rafael@kernel.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.