From: Rafael J. Wysocki The sysfs files /sys/power/disk and /sys/power/state do not work as documented, since they allow the user to write only a few initial characters of the input string to trigger the option (eg. 'echo pl > /sys/power/disk' activates the platform mode of hibernation). Fix it. Special thanks to Peter Moulder for pointing out the problem. Signed-off-by: Rafael J. Wysocki Acked-by: Pavel Machek Signed-off-by: Andrew Morton --- kernel/power/disk.c | 3 ++- kernel/power/main.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff -puN kernel/power/disk.c~swsusp-fix-sysfs-interface kernel/power/disk.c --- a/kernel/power/disk.c~swsusp-fix-sysfs-interface +++ a/kernel/power/disk.c @@ -416,7 +416,8 @@ static ssize_t disk_store(struct kset *k mutex_lock(&pm_mutex); for (i = HIBERNATION_FIRST; i <= HIBERNATION_MAX; i++) { - if (!strncmp(buf, hibernation_modes[i], len)) { + if (len == strlen(hibernation_modes[i]) + && !strncmp(buf, hibernation_modes[i], len)) { mode = i; break; } diff -puN kernel/power/main.c~swsusp-fix-sysfs-interface kernel/power/main.c --- a/kernel/power/main.c~swsusp-fix-sysfs-interface +++ a/kernel/power/main.c @@ -289,13 +289,13 @@ static ssize_t state_store(struct kset * len = p ? p - buf : n; /* First, check if we are requested to hibernate */ - if (!strncmp(buf, "disk", len)) { + if (len == 4 && !strncmp(buf, "disk", len)) { error = hibernate(); return error ? error : n; } for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) { - if (*s && !strncmp(buf, *s, len)) + if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) break; } if (state < PM_SUSPEND_MAX && *s) _