]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
power: always freeze efivarfs
authorChristian Brauner <brauner@kernel.org>
Wed, 5 Nov 2025 13:39:45 +0000 (14:39 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 12 Nov 2025 09:12:39 +0000 (10:12 +0100)
The efivarfs filesystems must always be frozen and thawed to resync
variable state. Make it so.

Link: https://patch.msgid.link/20251105-vorbild-zutreffen-fe00d1dd98db@brauner
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/efivarfs/super.c
fs/super.c
include/linux/fs.h
kernel/power/hibernate.c
kernel/power/suspend.c

index 1f4d8ce56667006b04a2b6a8df5fc8f0a7604970..6de97565d5f7872c439b24f1c8c9557701c6073a 100644 (file)
@@ -533,6 +533,7 @@ static struct file_system_type efivarfs_type = {
        .init_fs_context = efivarfs_init_fs_context,
        .kill_sb = efivarfs_kill_sb,
        .parameters = efivarfs_parameters,
+       .fs_flags = FS_POWER_FREEZE,
 };
 
 static __init int efivarfs_init(void)
index 5bab94fb7e0358a59aeda0c0985d875e4463ade1..277b84e5c279134cae9be24fde4a3526dbbeb7e6 100644 (file)
@@ -1183,11 +1183,14 @@ static inline bool get_active_super(struct super_block *sb)
 
 static const char *filesystems_freeze_ptr = "filesystems_freeze";
 
-static void filesystems_freeze_callback(struct super_block *sb, void *unused)
+static void filesystems_freeze_callback(struct super_block *sb, void *freeze_all_ptr)
 {
        if (!sb->s_op->freeze_fs && !sb->s_op->freeze_super)
                return;
 
+       if (freeze_all_ptr && !(sb->s_type->fs_flags & FS_POWER_FREEZE))
+               return;
+
        if (!get_active_super(sb))
                return;
 
@@ -1201,9 +1204,13 @@ static void filesystems_freeze_callback(struct super_block *sb, void *unused)
        deactivate_super(sb);
 }
 
-void filesystems_freeze(void)
+void filesystems_freeze(bool freeze_all)
 {
-       __iterate_supers(filesystems_freeze_callback, NULL,
+       void *freeze_all_ptr = NULL;
+
+       if (freeze_all)
+               freeze_all_ptr = &freeze_all;
+       __iterate_supers(filesystems_freeze_callback, freeze_all_ptr,
                         SUPER_ITER_UNLOCKED | SUPER_ITER_REVERSE);
 }
 
index 3ea98c6cce818c15b79dcfb2a952cb6f91c9d6b7..249a1da8440e0979e299fee761043204a1a0d657 100644 (file)
@@ -2689,6 +2689,7 @@ struct file_system_type {
 #define FS_ALLOW_IDMAP         32      /* FS has been updated to handle vfs idmappings. */
 #define FS_MGTIME              64      /* FS uses multigrain timestamps */
 #define FS_LBS                 128     /* FS supports LBS */
+#define FS_POWER_FREEZE                256     /* Always freeze on suspend/hibernate */
 #define FS_RENAME_DOES_D_MOVE  32768   /* FS will handle d_move() during rename() internally. */
        int (*init_fs_context)(struct fs_context *);
        const struct fs_parameter_spec *parameters;
@@ -3606,7 +3607,7 @@ extern void drop_super_exclusive(struct super_block *sb);
 extern void iterate_supers(void (*f)(struct super_block *, void *), void *arg);
 extern void iterate_supers_type(struct file_system_type *,
                                void (*)(struct super_block *, void *), void *);
-void filesystems_freeze(void);
+void filesystems_freeze(bool freeze_all);
 void filesystems_thaw(void);
 
 extern int dcache_dir_open(struct inode *, struct file *);
index 14e85ff235512343be317d028c8dcb9d7b336ce4..1f250ce036a0e19bd6b7a972daacbee227ba4d03 100644 (file)
@@ -825,8 +825,7 @@ int hibernate(void)
                goto Restore;
 
        ksys_sync_helper();
-       if (filesystem_freeze_enabled)
-               filesystems_freeze();
+       filesystems_freeze(filesystem_freeze_enabled);
 
        error = freeze_processes();
        if (error)
@@ -932,8 +931,7 @@ int hibernate_quiet_exec(int (*func)(void *data), void *data)
        if (error)
                goto restore;
 
-       if (filesystem_freeze_enabled)
-               filesystems_freeze();
+       filesystems_freeze(filesystem_freeze_enabled);
 
        error = freeze_processes();
        if (error)
@@ -1083,8 +1081,7 @@ static int software_resume(void)
        if (error)
                goto Restore;
 
-       if (filesystem_freeze_enabled)
-               filesystems_freeze();
+       filesystems_freeze(filesystem_freeze_enabled);
 
        pm_pr_dbg("Preparing processes for hibernation restore.\n");
        error = freeze_processes();
index 4bb4686c1c08818fa97ebb1f13813173a7c49e55..c933a63a97183588c64d60dccd978ef116f7ea2b 100644 (file)
@@ -375,8 +375,7 @@ static int suspend_prepare(suspend_state_t state)
        if (error)
                goto Restore;
 
-       if (filesystem_freeze_enabled)
-               filesystems_freeze();
+       filesystems_freeze(filesystem_freeze_enabled);
        trace_suspend_resume(TPS("freeze_processes"), 0, true);
        error = suspend_freeze_processes();
        trace_suspend_resume(TPS("freeze_processes"), 0, false);