On Wed, Apr 01, 2026 at 15:17:29 +0100, Daniel P. Berrangé wrote:
> On Wed, Apr 01, 2026 at 03:27:15PM +0200, Peter Krempa via Devel wrote:
> > From: Peter Krempa <[email protected]>
> > 
> > In certain cases it's useful for the caller to be able to determine if
> > given API supports some flags.
> > 
> > To do this with 'virDomainBlockResize', if
> > 'VIR_DOMAIN_BLOCK_RESIZE_PROBE_FLAGS' is specified, the API will return
> > success right after flag verification, regardless of other input
> > arguments and without modifying anything.
> > 
> > Signed-off-by: Peter Krempa <[email protected]>
> > ---
> >  include/libvirt/libvirt-domain.h |  9 +++++++++
> >  src/libvirt-domain.c             | 12 ++++++++++++
> >  src/qemu/qemu_driver.c           |  7 ++++++-
> >  src/vz/vz_driver.c               |  7 ++++++-
> >  4 files changed, 33 insertions(+), 2 deletions(-)
> > 
> > diff --git a/include/libvirt/libvirt-domain.h 
> > b/include/libvirt/libvirt-domain.h
> > index 4a8e3114b3..113c7eefe6 100644
> > --- a/include/libvirt/libvirt-domain.h
> > +++ b/include/libvirt/libvirt-domain.h
> > @@ -2354,6 +2354,15 @@ typedef enum {
> > 
> >      /* Disallow shrinking (Since: 12.3.0) */
> >      VIR_DOMAIN_BLOCK_RESIZE_EXTEND = 1 << 2,
> > +
> > +    /* Ensures that the 'virDomainBlockResize' API returns success after
> > +     * checking support of 'flags' regardless of other arguments without
> > +     * actually modifying any aspect of the domain.
> > +     *
> > +     * Use of the flag thus allows probing for support of other flags of 
> > this
> > +     * API. (Since: 12.3.0) */
> > +    VIR_DOMAIN_BLOCK_RESIZE_PROBE_FLAGS = 1 << 3,
> > +
> >  } virDomainBlockResizeFlags;
> > 
> >  int                     virDomainBlockResize (virDomainPtr dom,
> > diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> > index db9eea5774..1b49d2f7e5 100644
> > --- a/src/libvirt-domain.c
> > +++ b/src/libvirt-domain.c
> > @@ -6469,6 +6469,18 @@ virDomainBlockPeek(virDomainPtr dom,
> >   * can be found by calling virDomainGetXMLDesc() and inspecting
> >   * elements within //domain/devices/disk.
> >   *
> > + * If @flags contains VIR_DOMAIN_BLOCK_RESIZE_PROBE_FLAGS (since 12.3.0) 
> > the
> > + * API will return success right after checking flags for support without
> > + * modifying the disk in any way, thus allowing probing of flags with the
> > + * following algorithm
> > + *
> > + *   supp = virDomainBlockResize(dom, "", 0, 
> > VIR_DOMAIN_BLOCK_RESIZE_PROBE_FLAGS | VIR_DOMAIN_BLOCK_RESIZE_EXTEND);
> > + *
> > + *   if (supp == 0)
> > + *      //flag supported
> > + *   else
> > + *     virResetLastError();
> 
> This suggests "flag" (singular), but if you pass many flags at once,
> then the error only tells you that at least 1 flag is invalid, but
> not which flag is invalid. So we need O(n) calls with PROBE_FLAGS
> if we want to check n different flags as distinct things.

I thought about this but I don't expect that this would be too widely
used, so the inability to query flags in bulk shouldn't be a problem.

I don't think there's a reasonable possibility to do this within the API
itself, and would thus require a new API.

> Also the "else" branch can also still be an error for non-probe
> related issues. eg there are many errors that the remote driver
> can raise from a transport POV.

I didn't think about this but if used in close proximity with the real
call I don't think there are many options where the probing call would
error out but then the further real call would succeed.

> How much better is this than simply trying the RESIZE_EXTEND usage
> unconditionally, and then falling back to a different code path if
> seeing  INVALID_ARG error ? 

The unfortunate thing and the reason I've picked this approach is that 
the code that follows here liberally uses VIR_ERR_INVALID_ARG. Even on
code paths where it makes sense to report error:

    if (!(disk = virDomainDiskByName(vm->def, path, false))) {
        virReportError(VIR_ERR_INVALID_ARG,
                       _("disk '%1$s' was not found in the domain config"), 
path);
        goto endjob;
    }

The caller (visible later in series) wouldn't be able to determine if
this is a case where the user messed up the disk and needs to see error
or is a case where the failure is from the real think we want to prevent
(accidental shrinking of the disk).

It would be possible to add a new error code for the 'unallowed shrink'
though to sidestep that problem although it would really be specific to
this scenario.

Reply via email to