snapshot: create bdrv_all_goto_snapshot helper
to switch to snapshot on all loaded block drivers. The patch also ensures proper locking. Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Greg Kurz <gkurz@linux.vnet.ibm.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> CC: Kevin Wolf <kwolf@redhat.com> Tested-by: Greg Kurz <gkurz@linux.vnet.ibm.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
		
							parent
							
								
									9b00ea376d
								
							
						
					
					
						commit
						4c1cdbaad0
					
				| @ -403,3 +403,23 @@ int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bad_bs, | ||||
|     *first_bad_bs = bs; | ||||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bad_bs) | ||||
| { | ||||
|     int err = 0; | ||||
|     BlockDriverState *bs = NULL; | ||||
| 
 | ||||
|     while (err == 0 && (bs = bdrv_next(bs))) { | ||||
|         AioContext *ctx = bdrv_get_aio_context(bs); | ||||
| 
 | ||||
|         aio_context_acquire(ctx); | ||||
|         if (bdrv_can_snapshot(bs)) { | ||||
|             err = bdrv_snapshot_goto(bs, name); | ||||
|         } | ||||
|         aio_context_release(ctx); | ||||
|     } | ||||
| 
 | ||||
|     *first_bad_bs = bs; | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| @ -84,5 +84,6 @@ int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverState *bs, | ||||
| bool bdrv_all_can_snapshot(BlockDriverState **first_bad_bs); | ||||
| int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bsd_bs, | ||||
|                              Error **err); | ||||
| int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bsd_bs); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -2093,16 +2093,11 @@ int load_vmstate(const char *name) | ||||
|     /* Flush all IO requests so they don't interfere with the new state.  */ | ||||
|     bdrv_drain_all(); | ||||
| 
 | ||||
|     bs = NULL; | ||||
|     while ((bs = bdrv_next(bs))) { | ||||
|         if (bdrv_can_snapshot(bs)) { | ||||
|             ret = bdrv_snapshot_goto(bs, name); | ||||
|             if (ret < 0) { | ||||
|                 error_report("Error %d while activating snapshot '%s' on '%s'", | ||||
|                              ret, name, bdrv_get_device_name(bs)); | ||||
|                 return ret; | ||||
|             } | ||||
|         } | ||||
|     ret = bdrv_all_goto_snapshot(name, &bs); | ||||
|     if (ret < 0) { | ||||
|         error_report("Error %d while activating snapshot '%s' on '%s'", | ||||
|                      ret, name, bdrv_get_device_name(bs)); | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     /* restore the VM state */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Denis V. Lunev
						Denis V. Lunev