On Thu, Jun 13, 2024 at 2:43 PM Daniel P. Berrangé <berra...@redhat.com>
wrote:

> On Tue, Jun 11, 2024 at 03:55:37PM +0200, Markus Armbruster wrote:
> > Daniel P. Berrangé <berra...@redhat.com> writes:
> >
> > > Rather than creating stubs for every command that just return
> > > QERR_UNSUPPORTED, use 'if' conditions in the QAPI schema to
> > > fully exclude generation of the commands on Windows.
> > >
> > > The command will be rejected at QMP dispatch time instead,
> > > avoiding reimplementing rejection by blocking the stub commands.
> > >
> > > This fixes inconsistency where some commands are implemented
> > > as stubs, yet not added to the blockedrpc list.
> > >
> > > This has the additional benefit that the QGA protocol reference
> > > now documents what conditions enable use of the command.
> > >
> > > Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
> > > ---
> > >  qga/commands-win32.c | 56 +-------------------------------------------
> > >  qga/qapi-schema.json | 45 +++++++++++++++++++++++------------
> > >  2 files changed, 31 insertions(+), 70 deletions(-)
> > >
> > > diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> > > index 9fe670d5b4..2533e4c748 100644
> > > --- a/qga/commands-win32.c
> > > +++ b/qga/commands-win32.c
> >
> > [...]
> >
> > >  /* add unsupported commands to the list of blocked RPCs */
> > >  GList *ga_command_init_blockedrpcs(GList *blockedrpcs)
> > >  {
> > > -    const char *list_unsupported[] = {
> > > -        "guest-suspend-hybrid",
> > > -        "guest-set-vcpus",
> > > -        "guest-get-memory-blocks", "guest-set-memory-blocks",
> > > -        "guest-get-memory-block-info",
> > > -        NULL};
> > > -    char **p = (char **)list_unsupported;
> > > -
> > > -    while (*p) {
> > > -        blockedrpcs = g_list_append(blockedrpcs, g_strdup(*p++));
> > > -    }
> > > -
> > >      if (!vss_init(true)) {
> > >          g_debug("vss_init failed, vss commands are going to be
> disabled");
> > >          const char *list[] = {
> > >              "guest-get-fsinfo", "guest-fsfreeze-status",
> > >              "guest-fsfreeze-freeze", "guest-fsfreeze-thaw", NULL};
> > > -        p = (char **)list;
> > > +        char **p = (char **)list;
> > >
> > >          while (*p) {
> > >              blockedrpcs = g_list_append(blockedrpcs, g_strdup(*p++));
> >            }
> >        }
> >
> >        return blockedrpcs;
> >    }
> >
> > Four commands get disabled when vss_init() fails, i.e. when qga-vss.dll
> > can't be loaded and initialized.
> >
> > Three of the four commands do this first:
> >
> >         if (!vss_initialized()) {
> >             error_setg(errp, QERR_UNSUPPORTED);
> >             return 0;
> >         }
> >
> > The execption is qmp_guest_get_fsinfo().
> >
> > vss_initialized() returns true between successful vss_init() and
> > vss_deinit().
> >
> > Aside: we call vss_init() in three places.  Two of them init, call
> > something, then deinit.  Weird.  Moving on.
>
> The two odd balls are a special case for the Windows only --service
> argument, which installs a Windows system service for VSS. In that
> case, the QGA immediately exits after (un)installing the service.
> So the vss_init+vss_deinit pairly makes sense there.
>
> > If these commands are meant to be only available when the DLL is, then
> > having them check vss_initialized() is useless.
>
> The DLL should always exist unless the install is broken, but versions
> of Windows prior to win2k3 don't support the required APIs, so vss_init
> could fail.
>

If Windows VSS is disabled vss_init could fail too. Also, one person
reported
an error that VSS failed to initialize after the first boot. I can't
reproduce this
so I have not details but we should check in runtime that QGA-VSS is
initialized
before trying to freeze fs, in case to be more sure where is error.


>
> > Conversely, if the check isn't useless, then the "make it available
> > only" business is.
>
> The 'make it available only" business is bad practice, as it does not
> allow a caller to distinguish between the admin manually disabling
> these commands, vs the commands being unavailable due to the OS not
> supporting the feature. This distinction  is important to preserve
> to benefit those triaging bugs about why this might fail.
>
> I'm going to get rid of the runtime blocking in
> ga_command_init_blockedrpcs,
> and also replace QERR_UNSUPPORTED with a more targetted error message to
> clearly articulate why the commands are failing.
>
> With regards,
> Daniel
> --
> |: https://berrange.com      -o-
> https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-
> https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-
> https://www.instagram.com/dberrange :|
>
>

Reply via email to