diff options
author | Nigel Cunningham <nigel@nigel.suspend2.net> | 2007-09-19 01:46:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-19 14:24:17 -0400 |
commit | 019ad4a0a60b09022945273848b5a686e39a78aa (patch) | |
tree | a54186525fec26bf6f1383d5756a879a09cf221e | |
parent | 2c392a4f47f41b24432e6aa77bb5167d0bbb10c5 (diff) |
Fix failure to resume from initrds
Commit 831441862956fffa17b9801db37e6ea1650b0f69 (Freezer: make kernel
threads nonfreezable by default) breaks freezing when attempting to resume
from an initrd, because the init (which is freezeable) spins while waiting
for another thread to run /linuxrc, but doesn't check whether it has been
told to enter the refrigerator. The original patch replaced a call to
try_to_freeze() with a call to yield(). I believe a simple reversion is
wrong because if !CONFIG_PM_SLEEP, try_to_freeze() is a noop. It should
still yield.
Signed-off-by: Nigel Cunningham <nigel@nigel.suspend2.net>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | init/do_mounts_initrd.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c index a6b4c0c08e13..fd4fc12d2624 100644 --- a/init/do_mounts_initrd.c +++ b/init/do_mounts_initrd.c | |||
@@ -57,8 +57,10 @@ static void __init handle_initrd(void) | |||
57 | 57 | ||
58 | pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); | 58 | pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD); |
59 | if (pid > 0) | 59 | if (pid > 0) |
60 | while (pid != sys_wait4(-1, NULL, 0, NULL)) | 60 | while (pid != sys_wait4(-1, NULL, 0, NULL)) { |
61 | try_to_freeze(); | ||
61 | yield(); | 62 | yield(); |
63 | } | ||
62 | 64 | ||
63 | /* move initrd to rootfs' /old */ | 65 | /* move initrd to rootfs' /old */ |
64 | sys_fchdir(old_fd); | 66 | sys_fchdir(old_fd); |