Skip to content

Commit a3f8f86

Browse files
committed
power: always freeze efivarfs
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>
1 parent 75fdd57 commit a3f8f86

File tree

5 files changed

+17
-12
lines changed

5 files changed

+17
-12
lines changed

fs/efivarfs/super.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ static struct file_system_type efivarfs_type = {
533533
.init_fs_context = efivarfs_init_fs_context,
534534
.kill_sb = efivarfs_kill_sb,
535535
.parameters = efivarfs_parameters,
536+
.fs_flags = FS_POWER_FREEZE,
536537
};
537538

538539
static __init int efivarfs_init(void)

fs/super.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,11 +1183,14 @@ static inline bool get_active_super(struct super_block *sb)
11831183

11841184
static const char *filesystems_freeze_ptr = "filesystems_freeze";
11851185

1186-
static void filesystems_freeze_callback(struct super_block *sb, void *unused)
1186+
static void filesystems_freeze_callback(struct super_block *sb, void *freeze_all_ptr)
11871187
{
11881188
if (!sb->s_op->freeze_fs && !sb->s_op->freeze_super)
11891189
return;
11901190

1191+
if (freeze_all_ptr && !(sb->s_type->fs_flags & FS_POWER_FREEZE))
1192+
return;
1193+
11911194
if (!get_active_super(sb))
11921195
return;
11931196

@@ -1201,9 +1204,13 @@ static void filesystems_freeze_callback(struct super_block *sb, void *unused)
12011204
deactivate_super(sb);
12021205
}
12031206

1204-
void filesystems_freeze(void)
1207+
void filesystems_freeze(bool freeze_all)
12051208
{
1206-
__iterate_supers(filesystems_freeze_callback, NULL,
1209+
void *freeze_all_ptr = NULL;
1210+
1211+
if (freeze_all)
1212+
freeze_all_ptr = &freeze_all;
1213+
__iterate_supers(filesystems_freeze_callback, freeze_all_ptr,
12071214
SUPER_ITER_UNLOCKED | SUPER_ITER_REVERSE);
12081215
}
12091216

include/linux/fs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2689,6 +2689,7 @@ struct file_system_type {
26892689
#define FS_ALLOW_IDMAP 32 /* FS has been updated to handle vfs idmappings. */
26902690
#define FS_MGTIME 64 /* FS uses multigrain timestamps */
26912691
#define FS_LBS 128 /* FS supports LBS */
2692+
#define FS_POWER_FREEZE 256 /* Always freeze on suspend/hibernate */
26922693
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */
26932694
int (*init_fs_context)(struct fs_context *);
26942695
const struct fs_parameter_spec *parameters;
@@ -3606,7 +3607,7 @@ extern void drop_super_exclusive(struct super_block *sb);
36063607
extern void iterate_supers(void (*f)(struct super_block *, void *), void *arg);
36073608
extern void iterate_supers_type(struct file_system_type *,
36083609
void (*)(struct super_block *, void *), void *);
3609-
void filesystems_freeze(void);
3610+
void filesystems_freeze(bool freeze_all);
36103611
void filesystems_thaw(void);
36113612

36123613
extern int dcache_dir_open(struct inode *, struct file *);

kernel/power/hibernate.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,7 @@ int hibernate(void)
825825
goto Restore;
826826

827827
ksys_sync_helper();
828-
if (filesystem_freeze_enabled)
829-
filesystems_freeze();
828+
filesystems_freeze(filesystem_freeze_enabled);
830829

831830
error = freeze_processes();
832831
if (error)
@@ -932,8 +931,7 @@ int hibernate_quiet_exec(int (*func)(void *data), void *data)
932931
if (error)
933932
goto restore;
934933

935-
if (filesystem_freeze_enabled)
936-
filesystems_freeze();
934+
filesystems_freeze(filesystem_freeze_enabled);
937935

938936
error = freeze_processes();
939937
if (error)
@@ -1083,8 +1081,7 @@ static int software_resume(void)
10831081
if (error)
10841082
goto Restore;
10851083

1086-
if (filesystem_freeze_enabled)
1087-
filesystems_freeze();
1084+
filesystems_freeze(filesystem_freeze_enabled);
10881085

10891086
pm_pr_dbg("Preparing processes for hibernation restore.\n");
10901087
error = freeze_processes();

kernel/power/suspend.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,7 @@ static int suspend_prepare(suspend_state_t state)
375375
if (error)
376376
goto Restore;
377377

378-
if (filesystem_freeze_enabled)
379-
filesystems_freeze();
378+
filesystems_freeze(filesystem_freeze_enabled);
380379
trace_suspend_resume(TPS("freeze_processes"), 0, true);
381380
error = suspend_freeze_processes();
382381
trace_suspend_resume(TPS("freeze_processes"), 0, false);

0 commit comments

Comments
 (0)