vhost-user: Improve -netdev/netdev_add/-net/... error reporting
When -netdev vhost-user fails, it first reports a specific error, then one or more generic ones, like this: $ qemu-system-x86_64 -netdev vhost-user,id=foo,chardev=xxx qemu-system-x86_64: -netdev vhost-user,id=foo,chardev=xxx: chardev "xxx" not found qemu-system-x86_64: -netdev vhost-user,id=foo,chardev=xxx: No suitable chardev found qemu-system-x86_64: -netdev vhost-user,id=foo,chardev=xxx: Device 'vhost-user' could not be initialized With the command line, the messages go to stderr. In HMP, they go to the monitor. In QMP, the last one becomes the error reply, and the others go to stderr. Convert net_init_vhost_user() and its helpers to Error. This suppresses the unwanted unspecific error messages, and makes the specific error the QMP error reply. Cc: Stefan Hajnoczi <stefanha@redhat.com> Cc: Jason Wang <jasowang@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
71df1d8337
commit
8190483196
@ -170,33 +170,34 @@ static int net_vhost_chardev_opts(void *opaque,
|
|||||||
} else if (strcmp(name, "server") == 0) {
|
} else if (strcmp(name, "server") == 0) {
|
||||||
props->is_server = true;
|
props->is_server = true;
|
||||||
} else {
|
} else {
|
||||||
error_report("vhost-user does not support a chardev"
|
error_setg(errp,
|
||||||
" with the following option:\n %s = %s",
|
"vhost-user does not support a chardev with option %s=%s",
|
||||||
name, value);
|
name, value);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CharDriverState *net_vhost_parse_chardev(const NetdevVhostUserOptions *opts)
|
static CharDriverState *net_vhost_parse_chardev(
|
||||||
|
const NetdevVhostUserOptions *opts, Error **errp)
|
||||||
{
|
{
|
||||||
CharDriverState *chr = qemu_chr_find(opts->chardev);
|
CharDriverState *chr = qemu_chr_find(opts->chardev);
|
||||||
VhostUserChardevProps props;
|
VhostUserChardevProps props;
|
||||||
|
|
||||||
if (chr == NULL) {
|
if (chr == NULL) {
|
||||||
error_report("chardev \"%s\" not found", opts->chardev);
|
error_setg(errp, "chardev \"%s\" not found", opts->chardev);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* inspect chardev opts */
|
/* inspect chardev opts */
|
||||||
memset(&props, 0, sizeof(props));
|
memset(&props, 0, sizeof(props));
|
||||||
if (qemu_opt_foreach(chr->opts, net_vhost_chardev_opts, &props, NULL)) {
|
if (qemu_opt_foreach(chr->opts, net_vhost_chardev_opts, &props, errp)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!props.is_socket || !props.is_unix) {
|
if (!props.is_socket || !props.is_unix) {
|
||||||
error_report("chardev \"%s\" is not a unix socket",
|
error_setg(errp, "chardev \"%s\" is not a unix socket",
|
||||||
opts->chardev);
|
opts->chardev);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,7 +221,7 @@ static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
|
|||||||
|
|
||||||
if (strcmp(netdev, name) == 0 &&
|
if (strcmp(netdev, name) == 0 &&
|
||||||
strncmp(driver, virtio_name, strlen(virtio_name)) != 0) {
|
strncmp(driver, virtio_name, strlen(virtio_name)) != 0) {
|
||||||
error_report("vhost-user requires frontend driver virtio-net-*");
|
error_setg(errp, "vhost-user requires frontend driver virtio-net-*");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,7 +231,6 @@ static int net_vhost_check_net(void *opaque, QemuOpts *opts, Error **errp)
|
|||||||
int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
||||||
NetClientState *peer, Error **errp)
|
NetClientState *peer, Error **errp)
|
||||||
{
|
{
|
||||||
/* FIXME error_setg(errp, ...) on failure */
|
|
||||||
uint32_t queues;
|
uint32_t queues;
|
||||||
const NetdevVhostUserOptions *vhost_user_opts;
|
const NetdevVhostUserOptions *vhost_user_opts;
|
||||||
CharDriverState *chr;
|
CharDriverState *chr;
|
||||||
@ -238,15 +238,14 @@ int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
|||||||
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_VHOST_USER);
|
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_VHOST_USER);
|
||||||
vhost_user_opts = opts->vhost_user;
|
vhost_user_opts = opts->vhost_user;
|
||||||
|
|
||||||
chr = net_vhost_parse_chardev(vhost_user_opts);
|
chr = net_vhost_parse_chardev(vhost_user_opts, errp);
|
||||||
if (!chr) {
|
if (!chr) {
|
||||||
error_report("No suitable chardev found");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* verify net frontend */
|
/* verify net frontend */
|
||||||
if (qemu_opts_foreach(qemu_find_opts("device"), net_vhost_check_net,
|
if (qemu_opts_foreach(qemu_find_opts("device"), net_vhost_check_net,
|
||||||
(char *)name, NULL)) {
|
(char *)name, errp)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user