All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Brauner <brauner@kernel.org>
To: linux-fsdevel@vger.kernel.org, jack@suse.cz
Cc: Christian Brauner <brauner@kernel.org>,
	linux-kernel@vger.kernel.org,
	James Bottomley <James.Bottomley@hansenpartnership.com>,
	mcgrof@kernel.org, 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: [PATCH 4/6] super: use a common iterator (Part 1)
Date: Fri, 28 Mar 2025 17:15:56 +0100	[thread overview]
Message-ID: <20250328-work-freeze-v1-4-a2c3a6b0e7a6@kernel.org> (raw)
In-Reply-To: <20250328-work-freeze-v1-0-a2c3a6b0e7a6@kernel.org>

Use a common iterator for all callbacks.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 fs/super.c         | 67 +++++++++++-------------------------------------------
 include/linux/fs.h |  6 ++++-
 2 files changed, 18 insertions(+), 55 deletions(-)

diff --git a/fs/super.c b/fs/super.c
index c67ea3cdda41..0dd208804a74 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -887,37 +887,7 @@ void drop_super_exclusive(struct super_block *sb)
 }
 EXPORT_SYMBOL(drop_super_exclusive);
 
-static void __iterate_supers(void (*f)(struct super_block *))
-{
-	struct super_block *sb, *p = NULL;
-
-	spin_lock(&sb_lock);
-	list_for_each_entry(sb, &super_blocks, s_list) {
-		if (super_flags(sb, SB_DYING))
-			continue;
-		sb->s_count++;
-		spin_unlock(&sb_lock);
-
-		f(sb);
-
-		spin_lock(&sb_lock);
-		if (p)
-			__put_super(p);
-		p = sb;
-	}
-	if (p)
-		__put_super(p);
-	spin_unlock(&sb_lock);
-}
-/**
- *	iterate_supers - call function for all active superblocks
- *	@f: function to call
- *	@arg: argument to pass to it
- *
- *	Scans the superblock list and calls given function, passing it
- *	locked superblock and given argument.
- */
-void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
+void __iterate_supers(void (*f)(struct super_block *, void *), void *arg, bool excl)
 {
 	struct super_block *sb, *p = NULL;
 
@@ -927,14 +897,13 @@ void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
 
 		if (super_flags(sb, SB_DYING))
 			continue;
-
 		sb->s_count++;
 		spin_unlock(&sb_lock);
 
-		locked = super_lock_shared(sb);
+		locked = super_lock(sb, excl);
 		if (locked) {
 			f(sb, arg);
-			super_unlock_shared(sb);
+			super_unlock(sb, excl);
 		}
 
 		spin_lock(&sb_lock);
@@ -1111,11 +1080,9 @@ int reconfigure_super(struct fs_context *fc)
 	return retval;
 }
 
-static void do_emergency_remount_callback(struct super_block *sb)
+static void do_emergency_remount_callback(struct super_block *sb, void *unused)
 {
-	bool locked = super_lock_excl(sb);
-
-	if (locked && sb->s_root && sb->s_bdev && !sb_rdonly(sb)) {
+	if (sb->s_bdev && !sb_rdonly(sb)) {
 		struct fs_context *fc;
 
 		fc = fs_context_for_reconfigure(sb->s_root,
@@ -1126,13 +1093,11 @@ static void do_emergency_remount_callback(struct super_block *sb)
 			put_fs_context(fc);
 		}
 	}
-	if (locked)
-		super_unlock_excl(sb);
 }
 
 static void do_emergency_remount(struct work_struct *work)
 {
-	__iterate_supers(do_emergency_remount_callback);
+	__iterate_supers(do_emergency_remount_callback, NULL, true);
 	kfree(work);
 	printk("Emergency Remount complete\n");
 }
@@ -1148,24 +1113,18 @@ void emergency_remount(void)
 	}
 }
 
-static void do_thaw_all_callback(struct super_block *sb)
+static void do_thaw_all_callback(struct super_block *sb, void *unused)
 {
-	bool locked = super_lock_excl(sb);
-
-	if (locked && sb->s_root) {
-		if (IS_ENABLED(CONFIG_BLOCK))
-			while (sb->s_bdev && !bdev_thaw(sb->s_bdev))
-				pr_warn("Emergency Thaw on %pg\n", sb->s_bdev);
-		thaw_super_locked(sb, FREEZE_HOLDER_USERSPACE);
-		return;
-	}
-	if (locked)
-		super_unlock_excl(sb);
+	if (IS_ENABLED(CONFIG_BLOCK))
+		while (sb->s_bdev && !bdev_thaw(sb->s_bdev))
+			pr_warn("Emergency Thaw on %pg\n", sb->s_bdev);
+	thaw_super_locked(sb, FREEZE_HOLDER_USERSPACE);
+	return;
 }
 
 static void do_thaw_all(struct work_struct *work)
 {
-	__iterate_supers(do_thaw_all_callback);
+	__iterate_supers(do_thaw_all_callback, NULL, true);
 	kfree(work);
 	printk(KERN_WARNING "Emergency Thaw complete\n");
 }
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 016b0fe1536e..0351500b71d2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -3515,7 +3515,11 @@ extern void put_filesystem(struct file_system_type *fs);
 extern struct file_system_type *get_fs_type(const char *name);
 extern void drop_super(struct super_block *sb);
 extern void drop_super_exclusive(struct super_block *sb);
-extern void iterate_supers(void (*)(struct super_block *, void *), void *);
+void __iterate_supers(void (*f)(struct super_block *, void *), void *arg, bool excl);
+static inline void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
+{
+	__iterate_supers(f, arg, false);
+}
 extern void iterate_supers_type(struct file_system_type *,
 			        void (*)(struct super_block *, void *), void *);
 

-- 
2.47.2


  parent reply	other threads:[~2025-03-28 16:16 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       ` Christian Brauner [this message]
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 ` [RFC PATCH 4/4] vfs: add filesystem freeze/thaw callbacks for power management James Bottomley
2025-03-27 18:20   ` 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=20250328-work-freeze-v1-4-a2c3a6b0e7a6@kernel.org \
    --to=brauner@kernel.org \
    --cc=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.