Re: [PATCH] Allow initrd_load() before software_resume()

Nigel Cunningham
2003-08-01T01:15:47Z

Hi.

I'll try to apply it to the 2.4 version and include it in the upcoming
2.6 version. (Yes, upcoming means it's finally on the way).

Regards,

Nigel

On Fri, 2003-08-01 at 12:29, Pascal Brisset wrote:
> This patch adds a boot parameter "resume_initrd".
> If present, init will load the initrd before trying to resume.
>
> This makes it posssible to resume from an encrypted suspend image.
> The initrd should insmod cryptoloop.o or loop-AES.o and perform
> losetup -e so that resume=/dev/loopX makes sense.
> Note: software_resume() should not be allowed to complete if
> initrd has altered disks (e.g. by flushing journals).
>
> /initrd
> |-- bin
> | |-- ash
> | |-- insmod
> | `-- losetup
> |-- dev
> | |-- console
> | |-- hdaX
> | |-- loopX
> | |-- null
> | `-- tty
> |-- linuxrc
> |-- loop.o
> `-- lost+found
>
> Resuming works, but suspension seems to fail more frequently when
> the swap is encrypted. I am using loop-AES-v1.7d + patch for 2.6.
>
> Is it safe to suspend to loop devices ?
>
> -- Pascal
>
>
> ______________________________________________________________________
>
> diff -ur linux-2.6.0-test1.orig/Documentation/kernel-parameters.txt linux-2.6.0-test1/Documentation/kernel-parameters.txt
> --- linux-2.6.0-test1.orig/Documentation/kernel-parameters.txt 2003-07-14 05:39:36.000000000 +0200
> +++ linux-2.6.0-test1/Documentation/kernel-parameters.txt 2003-08-01 01:19:46.000000000 +0200
> @@ -816,6 +816,8 @@
>
> resume= [SWSUSP] Specify the partition device for software suspension
>
> + resume_initrd [SWSUSP] Run initrd before resuming from software suspension
> +
> riscom8= [HW,SERIAL]
> Format: <io_board1>[,<io_board2>[,...<io_boardN>]]
>
> diff -ur linux-2.6.0-test1.orig/init/do_mounts.c linux-2.6.0-test1/init/do_mounts.c
> --- linux-2.6.0-test1.orig/init/do_mounts.c 2003-07-14 05:32:44.000000000 +0200
> +++ linux-2.6.0-test1/init/do_mounts.c 2003-08-01 01:21:44.000000000 +0200
> @@ -49,6 +49,15 @@
> __setup("ro", readonly);
> __setup("rw", readwrite);
>
> +static int resume_initrd = 0;
> +static int __init set_resume_initrd(char *str)
> +{
> + resume_initrd = 1;
> + return 1;
> +}
> +
> +__setup("resume_initrd", set_resume_initrd);
> +
> static dev_t __init try_name(char *name, int part)
> {
> char path[64];
> @@ -365,12 +374,21 @@
>
> is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
>
> - /* This has to be before mounting root, because even readonly mount of reiserfs would replay
> - log corrupting stuff */
> - software_resume();
> + /* software_resume() has to be before mounting root, because even
> + readonly mount of reiserfs would replay log corrupting stuff.
> + However, users may still want to run initrd first. */
> + if (resume_initrd) {
> + if (initrd_load()) {
> + software_resume();
> + goto out;
> + }
> + }
> + else {
> + software_resume();
>
> - if (initrd_load())
> - goto out;
> + if (initrd_load())
> + goto out;
> + }
>
> if (is_floppy && rd_doload && rd_load_disk(0))
> ROOT_DEV = Root_RAM0;
--
Nigel Cunningham
495 St Georges Road South, Hastings 4201, New Zealand

You see, at just the right time, when we were still powerless,
Christ died for the ungodly.
-- Romans 5:6, NIV.