qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 2/3] bootdevice: check boot order argument va


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v2 2/3] bootdevice: check boot order argument validation before vm running
Date: Fri, 06 Feb 2015 10:06:19 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

<address@hidden> writes:

> From: Gonglei <address@hidden>
>
> Either 'once' option or 'order' option can take effect for -boot at
> the same time, that is say initial startup processing can check only
> one. And pc.c's set_boot_dev() fails when its boot order argument
> is invalid. This patch provide a solution fix this problem:
>
>  1. If "once" is given, register reset handler to restore boot order.
>
>  2. Pass the normal boot order to machine creation.  Should fail when
>    the normal boot order is invalid.
>
>  3. If "once" is given, set it with qemu_boot_set().  Fails when the
>    once boot order is invalid.
>
>  4. Start the machine.
>
>  5. On reset, the reset handler calls qemu_boot_set() to restore boot
>    order.  Should never fail.
>
> Suggested-by: Markus Armbruster <address@hidden>
> Signed-off-by: Gonglei <address@hidden>
> ---
>  vl.c | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/vl.c b/vl.c
> index 983259b..0d90d98 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -2734,6 +2734,7 @@ int main(int argc, char **argv, char **envp)
>      const char *initrd_filename;
>      const char *kernel_filename, *kernel_cmdline;
>      const char *boot_order;
> +    const char *once = NULL;

Consider renaming once to boot_once.  In its much larger scope, the boot
context isn't obvious anymore, so a more telling name would be in order.

>      DisplayState *ds;
>      int cyls, heads, secs, translation;
>      QemuOpts *hda_opts = NULL, *opts, *machine_opts, *icount_opts = NULL;
> @@ -4046,7 +4047,7 @@ int main(int argc, char **argv, char **envp)
>      opts = qemu_opts_find(qemu_find_opts("boot-opts"), NULL);
>      if (opts) {
>          char *normal_boot_order;
> -        const char *order, *once;
> +        const char *order;
>          Error *local_err = NULL;
>  
>          order = qemu_opt_get(opts, "order");
> @@ -4067,7 +4068,6 @@ int main(int argc, char **argv, char **envp)
>                  exit(1);
>              }
>              normal_boot_order = g_strdup(boot_order);
> -            boot_order = once;
>              qemu_register_reset(restore_boot_order, normal_boot_order);
>          }
>  

normal_boot_order can be eliminated now.

        }
        qemu_register_reset(restore_boot_order, strdup(order));
    }

Even better, move qemu_register_reset()...

> @@ -4246,6 +4246,15 @@ int main(int argc, char **argv, char **envp)
>  
>      net_check_clients();
>  
> +    if (once) {
> +        Error *local_err = NULL;
> +        qemu_boot_set(once, &local_err);
> +        if (local_err) {
> +            error_report("%s", error_get_pretty(local_err));
> +            exit(1);
> +        }

... here:

           qemu_register_reset(restore_boot_order, strdup(boot_order));

> +    }
> +
>      ds = init_displaystate();
>  
>      /* init local displays */

Clearer, don't you think?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]