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…
	
		Reference in New Issue