migration: check pre_save return in vmstate_save_state
Check the return value of pre_save state and fail vmstate_save_state if the pre_save failed. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20170925112917.21340-3-dgilbert@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
		
							parent
							
								
									44b1ff319c
								
							
						
					
					
						commit
						551dbd0846
					
				| 
						 | 
				
			
			@ -994,8 +994,8 @@ extern const VMStateInfo vmstate_info_qtailq;
 | 
			
		|||
 | 
			
		||||
int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		||||
                       void *opaque, int version_id);
 | 
			
		||||
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		||||
                        void *opaque, QJSON *vmdesc);
 | 
			
		||||
int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		||||
                       void *opaque, QJSON *vmdesc);
 | 
			
		||||
 | 
			
		||||
bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@ savevm_state_iterate(void) ""
 | 
			
		|||
savevm_state_cleanup(void) ""
 | 
			
		||||
savevm_state_complete_precopy(void) ""
 | 
			
		||||
vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s"
 | 
			
		||||
vmstate_save_state_pre_save_res(const char *name, int res) "%s/%d"
 | 
			
		||||
vmstate_save_state_loop(const char *name, const char *field, int n_elems) "%s/%s[%d]"
 | 
			
		||||
vmstate_save_state_top(const char *idstr) "%s"
 | 
			
		||||
vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -308,15 +308,21 @@ bool vmstate_save_needed(const VMStateDescription *vmsd, void *opaque)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		||||
int vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		||||
                        void *opaque, QJSON *vmdesc)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    VMStateField *field = vmsd->fields;
 | 
			
		||||
 | 
			
		||||
    trace_vmstate_save_state_top(vmsd->name);
 | 
			
		||||
 | 
			
		||||
    if (vmsd->pre_save) {
 | 
			
		||||
        vmsd->pre_save(opaque);
 | 
			
		||||
        ret = vmsd->pre_save(opaque);
 | 
			
		||||
        trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
 | 
			
		||||
        if (ret) {
 | 
			
		||||
            error_report("pre-save failed: %s", vmsd->name);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (vmdesc) {
 | 
			
		||||
| 
						 | 
				
			
			@ -381,6 +387,8 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    vmstate_subsection_save(f, vmsd, opaque, vmdesc);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const VMStateDescription *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue