[libvirt PATCH 3/3] nodedev: handle mdevctl errors consistently
Peter Krempa
pkrempa at redhat.com
Tue Jun 15 16:44:17 UTC 2021
On Tue, Jun 15, 2021 at 11:28:40 -0500, Jonathon Jongsma wrote:
> Currently, we have two different types of mdevctl errors:
> 1. the command cannot be executed due to some error
> 2. the command is executed, but returns an error status
>
> These two different failures are handled differently. Scenario 1 calls
> virReportError() from within nodeDeviceGetMdevctlCommand() and returns
> an error status (-1). Scenario 2 also returns -1, but does not call
> virReportError() and instead passes the error message back in the
> errmsg argument.
>
> This means that the caller has to check both whether the return value is
> negative and whether the errmsg parameter is non-NULL before deciding
> whether to report the error or not. The situation is further complicated
> by the fact that there are occasional instances where mdevctl exits with
> an error status but does not print an error message. This results in
> errmsg being an empty string "" (i.e. non-NULL).
>
> Simplify the situation by not calling virReportError() at all from
> within nodeDeviceGetMdevctlCommand() and instead returning an error
> message for those that previously called virReportError(). The caller is
> now always responsible for reporting the error.
>
> Also introduce a simple macro that converts NULL or empty errmsg to
> "Unknown Error".
>
> Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
> ---
> src/node_device/node_device_driver.c | 34 ++++++++++++++--------------
> 1 file changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index e6d4e6ccb1..3cf9fc129f 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -752,14 +752,13 @@ nodeDeviceGetMdevctlCommand(virNodeDeviceDef *def,
> parent_addr = nodeDeviceFindAddressByName(def->parent);
>
> if (!parent_addr) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("unable to find parent device '%s'"), def->parent);
> + *errbuf = g_strdup_printf(_("unable to find parent device '%s'"),
> + def->parent);
> return NULL;
> }
>
> if (nodeDeviceDefToMdevctlConfig(def, &inbuf) < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("couldn't convert node device def to mdevctl JSON"));
> + *errbuf = g_strdup(_("couldn't convert node device def to mdevctl JSON"));
> return NULL;
> }
I'm not sure whether this works properly with translations.
>
> @@ -832,6 +831,9 @@ virMdevctlDefine(virNodeDeviceDef *def, char **uuid, char **errmsg)
> }
>
>
> +#define MDEVCTL_ERROR(msg) msg && msg[0] != '\0' ? msg : _("Unknown error")
> +
> +
> static virNodeDevicePtr
> nodeDeviceCreateXMLMdev(virConnectPtr conn,
> virNodeDeviceDef *def)
> @@ -846,10 +848,9 @@ nodeDeviceCreateXMLMdev(virConnectPtr conn,
> }
>
> if (virMdevctlCreate(def, &uuid, &errmsg) < 0) {
> - if (errmsg)
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Unable to start mediated device: %s"),
> - errmsg);
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unable to start mediated device: %s"),
> + MDEVCTL_ERROR(errmsg));
> return NULL;
> }
>
> @@ -1201,10 +1202,9 @@ nodeDeviceDestroy(virNodeDevicePtr device)
> }
>
> if (virMdevctlStop(def, &errmsg) < 0) {
> - if (errmsg)
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("Unable to destroy '%s': %s"), def->name,
> - errmsg);
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unable to destroy '%s': %s"), def->name,
This error message should contain also "mediated device" so that it's
easier to translate.
> + MDEVCTL_ERROR(errmsg));
> goto cleanup;
> }
> ret = 0;
[...]
> @@ -1372,7 +1372,7 @@ nodeDeviceUndefine(virNodeDevice *device,
> if (virMdevctlUndefine(def, &errmsg) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Unable to undefine mediated device: %s"),
> - errmsg && errmsg[0] ? errmsg : "Unknown Error");
> + MDEVCTL_ERROR(errmsg));
> goto cleanup;
> }
> ret = 0;
> @@ -1419,7 +1419,7 @@ nodeDeviceCreate(virNodeDevice *device,
> if (virMdevctlStart(def, &errmsg) < 0) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("Unable to create mediated device: %s"),
> - errmsg && errmsg[0] ? errmsg : "Unknown Error");
> + MDEVCTL_ERROR(errmsg));
> goto cleanup;
> }
> ret = 0;
These two almost look like a separate refactor.
More information about the libvir-list
mailing list