@@ -583,6 +583,7 @@ void migration_fd_process_incoming(QEMUFile *f)
void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
MigrationIncomingState *mis = migration_incoming_get_current();
bool start_migration;
@@ -603,12 +604,10 @@ void migration_ioc_process_incoming(QIOChannel *ioc, Error **errp)
*/
start_migration = !migrate_use_multifd();
} else {
- Error *local_err = NULL;
/* Multiple connections */
assert(migrate_use_multifd());
- start_migration = multifd_recv_new_channel(ioc, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ start_migration = multifd_recv_new_channel(ioc, errp);
+ if (*errp) {
return;
}
}
@@ -971,6 +970,7 @@ static bool migrate_caps_check(bool *cap_list,
MigrationCapabilityStatusList *params,
Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
MigrationCapabilityStatusList *cap;
bool old_postcopy_cap;
MigrationIncomingState *mis = migration_incoming_get_current();
@@ -1764,7 +1764,7 @@ void migrate_del_blocker(Error *reason)
void qmp_migrate_incoming(const char *uri, Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
static bool once = true;
if (!deferred_incoming) {
@@ -1775,10 +1775,9 @@ void qmp_migrate_incoming(const char *uri, Error **errp)
error_setg(errp, "The incoming migration has already been started");
}
- qemu_start_incoming_migration(uri, &local_err);
+ qemu_start_incoming_migration(uri, errp);
- if (local_err) {
- error_propagate(errp, local_err);
+ if (*errp) {
return;
}
@@ -1856,7 +1855,7 @@ bool migration_is_blocked(Error **errp)
static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
bool resume, Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
if (resume) {
if (s->state != MIGRATION_STATUS_POSTCOPY_PAUSED) {
@@ -1909,9 +1908,8 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
"current migration capabilities");
return false;
}
- migrate_set_block_enabled(true, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ migrate_set_block_enabled(true, errp);
+ if (*errp) {
return false;
}
s->must_remove_block_options = true;
@@ -1935,7 +1933,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
bool has_inc, bool inc, bool has_detach, bool detach,
bool has_resume, bool resume, Error **errp)
{
- Error *local_err = NULL;
+ ERRP_AUTO_PROPAGATE();
MigrationState *s = migrate_get_current();
const char *p;
@@ -1946,17 +1944,17 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
}
if (strstart(uri, "tcp:", &p)) {
- tcp_start_outgoing_migration(s, p, &local_err);
+ tcp_start_outgoing_migration(s, p, errp);
#ifdef CONFIG_RDMA
} else if (strstart(uri, "rdma:", &p)) {
- rdma_start_outgoing_migration(s, p, &local_err);
+ rdma_start_outgoing_migration(s, p, errp);
#endif
} else if (strstart(uri, "exec:", &p)) {
- exec_start_outgoing_migration(s, p, &local_err);
+ exec_start_outgoing_migration(s, p, errp);
} else if (strstart(uri, "unix:", &p)) {
- unix_start_outgoing_migration(s, p, &local_err);
+ unix_start_outgoing_migration(s, p, errp);
} else if (strstart(uri, "fd:", &p)) {
- fd_start_outgoing_migration(s, p, &local_err);
+ fd_start_outgoing_migration(s, p, errp);
} else {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri",
"a valid migration protocol");
@@ -1966,9 +1964,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
return;
}
- if (local_err) {
- migrate_fd_error(s, local_err);
- error_propagate(errp, local_err);
+ if (*errp) {
+ migrate_fd_error(s, *errp);
return;
}
}
@@ -1474,14 +1474,14 @@ bool multifd_recv_all_channels_created(void)
*/
bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
MultiFDRecvParams *p;
- Error *local_err = NULL;
int id;
- id = multifd_recv_initial_packet(ioc, &local_err);
+ id = multifd_recv_initial_packet(ioc, errp);
if (id < 0) {
- multifd_recv_terminate_threads(local_err);
- error_propagate_prepend(errp, local_err,
+ multifd_recv_terminate_threads(*errp);
+ error_prepend(errp,
"failed to receive packet"
" via multifd channel %d: ",
atomic_read(&multifd_recv_state->count));
@@ -1491,10 +1491,9 @@ bool multifd_recv_new_channel(QIOChannel *ioc, Error **errp)
p = &multifd_recv_state->params[id];
if (p->c != NULL) {
- error_setg(&local_err, "multifd: received id '%d' already setup'",
+ error_setg(errp, "multifd: received id '%d' already setup'",
id);
- multifd_recv_terminate_threads(local_err);
- error_propagate(errp, local_err);
+ multifd_recv_terminate_threads(*errp);
return false;
}
p->c = ioc;
@@ -2396,8 +2396,9 @@ static void qemu_rdma_cleanup(RDMAContext *rdma)
static int qemu_rdma_source_init(RDMAContext *rdma, bool pin_all, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
int ret, idx;
- Error *local_err = NULL, **temp = &local_err;
+ Error **temp = errp;
/*
* Will be validated against destination's actual capabilities
@@ -2450,7 +2451,6 @@ static int qemu_rdma_source_init(RDMAContext *rdma, bool pin_all, Error **errp)
return 0;
err_rdma_source_init:
- error_propagate(errp, local_err);
qemu_rdma_cleanup(rdma);
return -1;
}
@@ -4044,18 +4044,18 @@ static void rdma_accept_incoming_migration(void *opaque)
void rdma_start_incoming_migration(const char *host_port, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
int ret;
RDMAContext *rdma, *rdma_return_path = NULL;
- Error *local_err = NULL;
trace_rdma_start_incoming_migration();
- rdma = qemu_rdma_data_init(host_port, &local_err);
+ rdma = qemu_rdma_data_init(host_port, errp);
if (rdma == NULL) {
goto err;
}
- ret = qemu_rdma_dest_init(rdma, &local_err);
+ ret = qemu_rdma_dest_init(rdma, errp);
if (ret) {
goto err;
@@ -4074,7 +4074,7 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
/* initialize the RDMAContext for return path */
if (migrate_postcopy()) {
- rdma_return_path = qemu_rdma_data_init(host_port, &local_err);
+ rdma_return_path = qemu_rdma_data_init(host_port, errp);
if (rdma_return_path == NULL) {
goto err;
@@ -4087,7 +4087,6 @@ void rdma_start_incoming_migration(const char *host_port, Error **errp)
NULL, (void *)(intptr_t)rdma);
return;
err:
- error_propagate(errp, local_err);
g_free(rdma);
g_free(rdma_return_path);
}
@@ -2586,6 +2586,7 @@ int qemu_load_device_state(QEMUFile *f)
int save_snapshot(const char *name, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
BlockDriverState *bs, *bs1;
QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1;
int ret = -1;
@@ -2790,6 +2791,7 @@ void qmp_xen_load_devices_state(const char *filename, Error **errp)
int load_snapshot(const char *name, Error **errp)
{
+ ERRP_AUTO_PROPAGATE();
BlockDriverState *bs, *bs_vm_state;
QEMUSnapshotInfo sn;
QEMUFile *f;
@@ -139,12 +139,11 @@ void tcp_start_outgoing_migration(MigrationState *s,
const char *host_port,
Error **errp)
{
- Error *err = NULL;
- SocketAddress *saddr = tcp_build_address(host_port, &err);
- if (!err) {
- socket_start_outgoing_migration(s, saddr, &err);
+ ERRP_AUTO_PROPAGATE();
+ SocketAddress *saddr = tcp_build_address(host_port, errp);
+ if (!*errp) {
+ socket_start_outgoing_migration(s, saddr, errp);
}
- error_propagate(errp, err);
}
void unix_start_outgoing_migration(MigrationState *s,
@@ -209,13 +208,12 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
void tcp_start_incoming_migration(const char *host_port, Error **errp)
{
- Error *err = NULL;
- SocketAddress *saddr = tcp_build_address(host_port, &err);
- if (!err) {
- socket_start_incoming_migration(saddr, &err);
+ ERRP_AUTO_PROPAGATE();
+ SocketAddress *saddr = tcp_build_address(host_port, errp);
+ if (!*errp) {
+ socket_start_incoming_migration(saddr, errp);
}
qapi_free_SocketAddress(saddr);
- error_propagate(errp, err);
}
void unix_start_incoming_migration(const char *path, Error **errp)
If we want to add some info to errp (by error_prepend() or error_append_hint()), we must use the ERRP_AUTO_PROPAGATE macro. Otherwise, this info will not be added when errp == &fatal_err (the program will exit prior to the error_append_hint() or error_prepend() call). Fix such cases. If we want to check error after errp-function call, we need to introduce local_err and than propagate it to errp. Instead, use ERRP_AUTO_PROPAGATE macro, benefits are: 1. No need of explicit error_propagate call 2. No need of explicit local_err variable: use errp directly 3. ERRP_AUTO_PROPAGATE leaves errp as is if it's not NULL or &error_fatel, this means that we don't break error_abort (we'll abort on error_set, not on error_propagate) This commit (together with its neighbors) was generated by for f in $(git grep -l errp \*.[ch]); do \ spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \ --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff $f; \ done; then fix a bit of compilation problems: coccinelle for some reason leaves several f() { ... goto out; ... out: } patterns, with "out:" at function end. then ./python/commit-per-subsystem.py MAINTAINERS "$(< auto-msg)" (auto-msg was a file with this commit message) Still, for backporting it may be more comfortable to use only the first command and then do one huge commit. Reported-by: Kevin Wolf <kwolf@redhat.com> Reported-by: Greg Kurz <groug@kaod.org> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- migration/migration.c | 39 ++++++++++++++++++--------------------- migration/ram.c | 13 ++++++------- migration/rdma.c | 13 ++++++------- migration/savevm.c | 2 ++ migration/socket.c | 18 ++++++++---------- 5 files changed, 40 insertions(+), 45 deletions(-)