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;
 | 
					    *first_bad_bs = bs;
 | 
				
			||||||
    return ret;
 | 
					    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);
 | 
					bool bdrv_all_can_snapshot(BlockDriverState **first_bad_bs);
 | 
				
			||||||
int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bsd_bs,
 | 
					int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bsd_bs,
 | 
				
			||||||
                             Error **err);
 | 
					                             Error **err);
 | 
				
			||||||
 | 
					int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bsd_bs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -2093,17 +2093,12 @@ int load_vmstate(const char *name)
 | 
				
			|||||||
    /* Flush all IO requests so they don't interfere with the new state.  */
 | 
					    /* Flush all IO requests so they don't interfere with the new state.  */
 | 
				
			||||||
    bdrv_drain_all();
 | 
					    bdrv_drain_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bs = NULL;
 | 
					    ret = bdrv_all_goto_snapshot(name, &bs);
 | 
				
			||||||
    while ((bs = bdrv_next(bs))) {
 | 
					 | 
				
			||||||
        if (bdrv_can_snapshot(bs)) {
 | 
					 | 
				
			||||||
            ret = bdrv_snapshot_goto(bs, name);
 | 
					 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_report("Error %d while activating snapshot '%s' on '%s'",
 | 
					        error_report("Error %d while activating snapshot '%s' on '%s'",
 | 
				
			||||||
                     ret, name, bdrv_get_device_name(bs));
 | 
					                     ret, name, bdrv_get_device_name(bs));
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* restore the VM state */
 | 
					    /* restore the VM state */
 | 
				
			||||||
    f = qemu_fopen_bdrv(bs_vm_state, 0);
 | 
					    f = qemu_fopen_bdrv(bs_vm_state, 0);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user