cpus: Let vm_stop[_force_state]() always flush block devices
Even if the VM is already stopped, we cannot assume that all data has already been successfully flushed to disk. The flush during the previous vm_stop() could have failed. Run bdrv_flush_all() unconditionally so that we get an error each time if the block device isn't really flushed. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									323004a39d
								
							
						
					
					
						commit
						594a45ce64
					
				
							
								
								
									
										9
									
								
								cpus.c
								
								
								
								
							
							
						
						
									
										9
									
								
								cpus.c
								
								
								
								
							| 
						 | 
				
			
			@ -443,11 +443,12 @@ static int do_vm_stop(RunState state)
 | 
			
		|||
        pause_all_vcpus();
 | 
			
		||||
        runstate_set(state);
 | 
			
		||||
        vm_state_notify(0, state);
 | 
			
		||||
        bdrv_drain_all();
 | 
			
		||||
        ret = bdrv_flush_all();
 | 
			
		||||
        monitor_protocol_event(QEVENT_STOP, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bdrv_drain_all();
 | 
			
		||||
    ret = bdrv_flush_all();
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1126,7 +1127,9 @@ int vm_stop_force_state(RunState state)
 | 
			
		|||
        return vm_stop(state);
 | 
			
		||||
    } else {
 | 
			
		||||
        runstate_set(state);
 | 
			
		||||
        return 0;
 | 
			
		||||
        /* Make sure to return an error if the flush in a previous vm_stop()
 | 
			
		||||
         * failed. */
 | 
			
		||||
        return bdrv_flush_all();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue