@ -914,9 +914,7 @@ process_incoming_migration_co(void *opaque)
fail :
migrate_set_state ( & mis - > state , MIGRATION_STATUS_ACTIVE ,
MIGRATION_STATUS_FAILED ) ;
migrate_set_error ( s , local_err ) ;
error_free ( local_err ) ;
migrate_error_propagate ( s , local_err ) ;
migration_incoming_state_destroy ( ) ;
if ( mis - > exit_on_error ) {
@ -1548,14 +1546,20 @@ static void migration_cleanup_bh(void *opaque)
migration_cleanup ( opaque ) ;
}
void migrate_set_error ( MigrationState * s , const Error * error )
/*
* Propagate the Error * object to migration core . The caller mustn ' t
* reference the error pointer after the function returned , because the
* Error * object might be freed .
*/
void migrate_error_propagate ( MigrationState * s , Error * error )
{
QEMU_LOCK_GUARD ( & s - > error_mutex ) ;
trace_migrate_error ( error_get_pretty ( error ) ) ;
if ( ! s - > error ) {
s - > error = error_copy ( error ) ;
s - > error = error ;
} else {
error_free ( error ) ;
}
}
@ -1601,8 +1605,7 @@ static void migration_connect_error_propagate(MigrationState *s, Error *error)
}
migrate_set_state ( & s - > state , current , next ) ;
migrate_set_error ( s , error ) ;
error_free ( error ) ;
migrate_error_propagate ( s , error ) ;
}
void migration_cancel ( void )
@ -2014,8 +2017,7 @@ void qmp_migrate_pause(Error **errp)
/* Tell the core migration that we're pausing */
error_setg ( & error , " Postcopy migration is paused by the user " ) ;
migrate_set_error ( ms , error ) ;
error_free ( error ) ;
migrate_error_propagate ( ms , error ) ;
qemu_mutex_lock ( & ms - > qemu_file_lock ) ;
if ( ms - > to_dst_file ) {
@ -2647,8 +2649,7 @@ static void *source_return_path_thread(void *opaque)
out :
if ( err ) {
migrate_set_error ( ms , err ) ;
error_free ( err ) ;
migrate_error_propagate ( ms , err ) ;
trace_source_return_path_thread_bad_end ( ) ;
}
@ -3094,12 +3095,10 @@ static void migration_completion(MigrationState *s)
fail :
if ( qemu_file_get_error_obj ( s - > to_dst_file , & local_err ) ) {
migrate_set_error ( s , local_err ) ;
error_free ( local_err ) ;
migrate_error_propagate ( s , local_err ) ;
} else if ( ret ) {
error_setg_errno ( & local_err , - ret , " Error in migration completion " ) ;
migrate_set_error ( s , local_err ) ;
error_free ( local_err ) ;
migrate_error_propagate ( s , local_err ) ;
}
if ( s - > state ! = MIGRATION_STATUS_CANCELLING ) {
@ -3326,8 +3325,7 @@ static MigThrError migration_detect_error(MigrationState *s)
}
if ( local_error ) {
migrate_set_error ( s , local_error ) ;
error_free ( local_error ) ;
migrate_error_propagate ( s , local_error ) ;
}
if ( state = = MIGRATION_STATUS_POSTCOPY_ACTIVE & & ret ) {
@ -3522,7 +3520,7 @@ static MigIterateState migration_iteration_run(MigrationState *s)
if ( must_precopy < = s - > threshold_size & &
can_switchover & & qatomic_read ( & s - > start_postcopy ) ) {
if ( postcopy_start ( s , & local_err ) ) {
migrate_set_ error ( s , local_err ) ;
migrate_error_propagate ( s , error_copy ( local_err ) ) ;
error_report_err ( local_err ) ;
}
return MIG_ITERATE_SKIP ;
@ -3819,8 +3817,7 @@ static void *migration_thread(void *opaque)
* devices to unplug . This to preserve migration state transitions .
*/
if ( ret ) {
migrate_set_error ( s , local_err ) ;
error_free ( local_err ) ;
migrate_error_propagate ( s , local_err ) ;
migrate_set_state ( & s - > state , MIGRATION_STATUS_ACTIVE ,
MIGRATION_STATUS_FAILED ) ;
goto out ;
@ -3944,8 +3941,7 @@ static void *bg_migration_thread(void *opaque)
* devices to unplug . This to preserve migration state transitions .
*/
if ( ret ) {
migrate_set_error ( s , local_err ) ;
error_free ( local_err ) ;
migrate_error_propagate ( s , local_err ) ;
migrate_set_state ( & s - > state , MIGRATION_STATUS_ACTIVE ,
MIGRATION_STATUS_FAILED ) ;
goto fail_setup ;
@ -4127,7 +4123,7 @@ void migration_connect(MigrationState *s, Error *error_in)
return ;
fail :
migrate_set_ error ( s , local_err ) ;
migrate_error_propagate ( s , error_copy ( local_err ) ) ;
if ( s - > state ! = MIGRATION_STATUS_CANCELLING ) {
migrate_set_state ( & s - > state , s - > state , MIGRATION_STATUS_FAILED ) ;
}