Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

+17 -12
+1
fs/efivarfs/super.c
··· 533 533 .init_fs_context = efivarfs_init_fs_context, 534 534 .kill_sb = efivarfs_kill_sb, 535 535 .parameters = efivarfs_parameters, 536 + .fs_flags = FS_POWER_FREEZE, 536 537 }; 537 538 538 539 static __init int efivarfs_init(void)
+10 -3
fs/super.c
··· 1183 1183 1184 1184 static const char *filesystems_freeze_ptr = "filesystems_freeze"; 1185 1185 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) 1187 1187 { 1188 1188 if (!sb->s_op->freeze_fs && !sb->s_op->freeze_super) 1189 + return; 1190 + 1191 + if (freeze_all_ptr && !(sb->s_type->fs_flags & FS_POWER_FREEZE)) 1189 1192 return; 1190 1193 1191 1194 if (!get_active_super(sb)) ··· 1204 1201 deactivate_super(sb); 1205 1202 } 1206 1203 1207 - void filesystems_freeze(void) 1204 + void filesystems_freeze(bool freeze_all) 1208 1205 { 1209 - __iterate_supers(filesystems_freeze_callback, NULL, 1206 + void *freeze_all_ptr = NULL; 1207 + 1208 + if (freeze_all) 1209 + freeze_all_ptr = &freeze_all; 1210 + __iterate_supers(filesystems_freeze_callback, freeze_all_ptr, 1210 1211 SUPER_ITER_UNLOCKED | SUPER_ITER_REVERSE); 1211 1212 } 1212 1213
+2 -1
include/linux/fs.h
··· 2689 2689 #define FS_ALLOW_IDMAP 32 /* FS has been updated to handle vfs idmappings. */ 2690 2690 #define FS_MGTIME 64 /* FS uses multigrain timestamps */ 2691 2691 #define FS_LBS 128 /* FS supports LBS */ 2692 + #define FS_POWER_FREEZE 256 /* Always freeze on suspend/hibernate */ 2692 2693 #define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */ 2693 2694 int (*init_fs_context)(struct fs_context *); 2694 2695 const struct fs_parameter_spec *parameters; ··· 3607 3606 extern void iterate_supers(void (*f)(struct super_block *, void *), void *arg); 3608 3607 extern void iterate_supers_type(struct file_system_type *, 3609 3608 void (*)(struct super_block *, void *), void *); 3610 - void filesystems_freeze(void); 3609 + void filesystems_freeze(bool freeze_all); 3611 3610 void filesystems_thaw(void); 3612 3611 3613 3612 extern int dcache_dir_open(struct inode *, struct file *);
+3 -6
kernel/power/hibernate.c
··· 825 825 goto Restore; 826 826 827 827 ksys_sync_helper(); 828 - if (filesystem_freeze_enabled) 829 - filesystems_freeze(); 828 + filesystems_freeze(filesystem_freeze_enabled); 830 829 831 830 error = freeze_processes(); 832 831 if (error) ··· 931 932 if (error) 932 933 goto restore; 933 934 934 - if (filesystem_freeze_enabled) 935 - filesystems_freeze(); 935 + filesystems_freeze(filesystem_freeze_enabled); 936 936 937 937 error = freeze_processes(); 938 938 if (error) ··· 1081 1083 if (error) 1082 1084 goto Restore; 1083 1085 1084 - if (filesystem_freeze_enabled) 1085 - filesystems_freeze(); 1086 + filesystems_freeze(filesystem_freeze_enabled); 1086 1087 1087 1088 pm_pr_dbg("Preparing processes for hibernation restore.\n"); 1088 1089 error = freeze_processes();
+1 -2
kernel/power/suspend.c
··· 375 375 if (error) 376 376 goto Restore; 377 377 378 - if (filesystem_freeze_enabled) 379 - filesystems_freeze(); 378 + filesystems_freeze(filesystem_freeze_enabled); 380 379 trace_suspend_resume(TPS("freeze_processes"), 0, true); 381 380 error = suspend_freeze_processes(); 382 381 trace_suspend_resume(TPS("freeze_processes"), 0, false);