net: Permit incremental conversion of init functions to Error
Error reporting for netdev_add is broken: the net_client_init_fun[] report the actual errors with (at best) error_report(), and their caller net_client_init1() makes up a generic error on top. For command line and HMP, this produces an mildly ugly error cascade. In QMP, the actual errors go to stderr, and the generic error becomes the command's error reply. To fix this, we need to convert the net_client_init_fun[] to Error. To permit fixing them one by one, add an Error ** parameter to the net_client_init_fun[]. If the call fails without returning an Error, make up the same generic Error as before. But if it returns one, use that instead. Since none of them does so far, no functional change. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 1431691143-1015-3-git-send-email-armbru@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
ca7eb1848b
commit
a30ecde6e7
@ -28,38 +28,38 @@
|
||||
#include "qapi-types.h"
|
||||
|
||||
int net_init_dump(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
#ifdef CONFIG_SLIRP
|
||||
int net_init_slirp(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
#endif
|
||||
|
||||
int net_init_hubport(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
int net_init_socket(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
int net_init_tap(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
int net_init_bridge(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
int net_init_l2tpv3(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
#ifdef CONFIG_VDE
|
||||
int net_init_vde(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NETMAP
|
||||
int net_init_netmap(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
#endif
|
||||
|
||||
int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer);
|
||||
NetClientState *peer, Error **errp);
|
||||
|
||||
#endif /* QEMU_NET_CLIENTS_H */
|
||||
|
@ -146,8 +146,9 @@ static int net_dump_init(NetClientState *peer, const char *device,
|
||||
}
|
||||
|
||||
int net_init_dump(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
int len;
|
||||
const char *file;
|
||||
char def_file[128];
|
||||
|
@ -281,7 +281,7 @@ int net_hub_id_for_client(NetClientState *nc, int *id)
|
||||
}
|
||||
|
||||
int net_init_hubport(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
const NetdevHubPortOptions *hubport;
|
||||
|
||||
|
@ -536,10 +536,9 @@ static NetClientInfo net_l2tpv3_info = {
|
||||
|
||||
int net_init_l2tpv3(const NetClientOptions *opts,
|
||||
const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
|
||||
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevL2TPv3Options *l2tpv3;
|
||||
NetL2TPV3State *s;
|
||||
NetClientState *nc;
|
||||
|
15
net/net.c
15
net/net.c
@ -740,8 +740,9 @@ int qemu_find_nic_model(NICInfo *nd, const char * const *models,
|
||||
}
|
||||
|
||||
static int net_init_nic(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
int idx;
|
||||
NICInfo *nd;
|
||||
const NetLegacyNicOptions *nic;
|
||||
@ -809,7 +810,7 @@ static int net_init_nic(const NetClientOptions *opts, const char *name,
|
||||
static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])(
|
||||
const NetClientOptions *opts,
|
||||
const char *name,
|
||||
NetClientState *peer) = {
|
||||
NetClientState *peer, Error **errp) = {
|
||||
[NET_CLIENT_OPTIONS_KIND_NIC] = net_init_nic,
|
||||
#ifdef CONFIG_SLIRP
|
||||
[NET_CLIENT_OPTIONS_KIND_USER] = net_init_slirp,
|
||||
@ -902,10 +903,12 @@ static int net_client_init1(const void *object, int is_netdev, Error **errp)
|
||||
peer = net_hub_add_port(u.net->has_vlan ? u.net->vlan : 0, NULL);
|
||||
}
|
||||
|
||||
if (net_client_init_fun[opts->kind](opts, name, peer) < 0) {
|
||||
/* TODO push error reporting into init() methods */
|
||||
error_set(errp, QERR_DEVICE_INIT_FAILED,
|
||||
NetClientOptionsKind_lookup[opts->kind]);
|
||||
if (net_client_init_fun[opts->kind](opts, name, peer, errp) < 0) {
|
||||
/* FIXME drop when all init functions store an Error */
|
||||
if (errp && !*errp) {
|
||||
error_set(errp, QERR_DEVICE_INIT_FAILED,
|
||||
NetClientOptionsKind_lookup[opts->kind]);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -446,8 +446,9 @@ static NetClientInfo net_netmap_info = {
|
||||
* ... -net netmap,ifname="..."
|
||||
*/
|
||||
int net_init_netmap(const NetClientOptions *opts,
|
||||
const char *name, NetClientState *peer)
|
||||
const char *name, NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevNetmapOptions *netmap_opts = opts->netmap;
|
||||
NetClientState *nc;
|
||||
NetmapPriv me;
|
||||
|
@ -737,8 +737,9 @@ static const char **slirp_dnssearch(const StringList *dnsname)
|
||||
}
|
||||
|
||||
int net_init_slirp(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
struct slirp_config_str *config;
|
||||
char *vnet;
|
||||
int ret;
|
||||
|
@ -693,8 +693,9 @@ static int net_socket_udp_init(NetClientState *peer,
|
||||
}
|
||||
|
||||
int net_init_socket(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
Error *err = NULL;
|
||||
const NetdevSocketOptions *sock;
|
||||
|
||||
|
@ -752,8 +752,9 @@ static int tap_win32_init(NetClientState *peer, const char *model,
|
||||
}
|
||||
|
||||
int net_init_tap(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevTapOptions *tap;
|
||||
|
||||
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_TAP);
|
||||
|
@ -531,8 +531,9 @@ static int net_bridge_run_helper(const char *helper, const char *bridge)
|
||||
}
|
||||
|
||||
int net_init_bridge(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevBridgeOptions *bridge;
|
||||
const char *helper, *br;
|
||||
|
||||
@ -699,8 +700,9 @@ static int get_fds(char *str, char *fds[], int max)
|
||||
}
|
||||
|
||||
int net_init_tap(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevTapOptions *tap;
|
||||
int fd, vnet_hdr = 0, i = 0, queues;
|
||||
/* for the no-fd, no-helper case */
|
||||
|
@ -110,8 +110,9 @@ static int net_vde_init(NetClientState *peer, const char *model,
|
||||
}
|
||||
|
||||
int net_init_vde(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevVdeOptions *vde;
|
||||
|
||||
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_VDE);
|
||||
|
@ -223,8 +223,9 @@ static int net_vhost_check_net(QemuOpts *opts, void *opaque)
|
||||
}
|
||||
|
||||
int net_init_vhost_user(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
NetClientState *peer, Error **errp)
|
||||
{
|
||||
/* FIXME error_setg(errp, ...) on failure */
|
||||
const NetdevVhostUserOptions *vhost_user_opts;
|
||||
CharDriverState *chr;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user