migration: implement bdrv_all_find_vmstate_bs helper
The patch also ensures proper locking for the operation. Signed-off-by: Denis V. Lunev <den@openvz.org> 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
0b46160521
commit
7cb1448149
@ -469,3 +469,18 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
|
|||||||
*first_bad_bs = bs;
|
*first_bad_bs = bs;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BlockDriverState *bdrv_all_find_vmstate_bs(void)
|
||||||
|
{
|
||||||
|
bool not_found = true;
|
||||||
|
BlockDriverState *bs = NULL;
|
||||||
|
|
||||||
|
while (not_found && (bs = bdrv_next(bs))) {
|
||||||
|
AioContext *ctx = bdrv_get_aio_context(bs);
|
||||||
|
|
||||||
|
aio_context_acquire(ctx);
|
||||||
|
not_found = !bdrv_can_snapshot(bs);
|
||||||
|
aio_context_release(ctx);
|
||||||
|
}
|
||||||
|
return bs;
|
||||||
|
}
|
||||||
|
@ -91,4 +91,6 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
|
|||||||
uint64_t vm_state_size,
|
uint64_t vm_state_size,
|
||||||
BlockDriverState **first_bad_bs);
|
BlockDriverState **first_bad_bs);
|
||||||
|
|
||||||
|
BlockDriverState *bdrv_all_find_vmstate_bs(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1905,17 +1905,6 @@ int qemu_loadvm_state(QEMUFile *f)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BlockDriverState *find_vmstate_bs(void)
|
|
||||||
{
|
|
||||||
BlockDriverState *bs = NULL;
|
|
||||||
while ((bs = bdrv_next(bs))) {
|
|
||||||
if (bdrv_can_snapshot(bs)) {
|
|
||||||
return bs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hmp_savevm(Monitor *mon, const QDict *qdict)
|
void hmp_savevm(Monitor *mon, const QDict *qdict)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs, *bs1;
|
BlockDriverState *bs, *bs1;
|
||||||
@ -1944,8 +1933,8 @@ void hmp_savevm(Monitor *mon, const QDict *qdict)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bs = find_vmstate_bs();
|
bs = bdrv_all_find_vmstate_bs();
|
||||||
if (!bs) {
|
if (bs == NULL) {
|
||||||
monitor_printf(mon, "No block device can accept snapshots\n");
|
monitor_printf(mon, "No block device can accept snapshots\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2054,7 +2043,7 @@ int load_vmstate(const char *name)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bs_vm_state = find_vmstate_bs();
|
bs_vm_state = bdrv_all_find_vmstate_bs();
|
||||||
if (!bs_vm_state) {
|
if (!bs_vm_state) {
|
||||||
error_report("No block device supports snapshots");
|
error_report("No block device supports snapshots");
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
@ -2123,7 +2112,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
|
|||||||
int total;
|
int total;
|
||||||
int *available_snapshots;
|
int *available_snapshots;
|
||||||
|
|
||||||
bs = find_vmstate_bs();
|
bs = bdrv_all_find_vmstate_bs();
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
monitor_printf(mon, "No available block device supports snapshots\n");
|
monitor_printf(mon, "No available block device supports snapshots\n");
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user