mirror of https://gitee.com/openkylin/qemu.git
block: add snapshot info query function bdrv_query_snapshot_info_list()
This patch adds function bdrv_query_snapshot_info_list(), which will retrieve snapshot info of an image in qmp object format. The implementation is based on the code moved from qemu-img.c with modification to fit more for qmp based block layer API. Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
bd07684aac
commit
fb0ed4539c
55
block/qapi.c
55
block/qapi.c
|
@ -26,29 +26,56 @@
|
||||||
#include "block/block_int.h"
|
#include "block/block_int.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
|
|
||||||
void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
|
/*
|
||||||
|
* Returns 0 on success, with *p_list either set to describe snapshot
|
||||||
|
* information, or NULL because there are no snapshots. Returns -errno on
|
||||||
|
* error, with *p_list untouched.
|
||||||
|
*/
|
||||||
|
int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
||||||
|
SnapshotInfoList **p_list,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
int i, sn_count;
|
int i, sn_count;
|
||||||
QEMUSnapshotInfo *sn_tab = NULL;
|
QEMUSnapshotInfo *sn_tab = NULL;
|
||||||
SnapshotInfoList *info_list, *cur_item = NULL;
|
SnapshotInfoList *info_list, *cur_item = NULL, *head = NULL;
|
||||||
|
SnapshotInfo *info;
|
||||||
|
|
||||||
sn_count = bdrv_snapshot_list(bs, &sn_tab);
|
sn_count = bdrv_snapshot_list(bs, &sn_tab);
|
||||||
|
if (sn_count < 0) {
|
||||||
|
const char *dev = bdrv_get_device_name(bs);
|
||||||
|
switch (sn_count) {
|
||||||
|
case -ENOMEDIUM:
|
||||||
|
error_setg(errp, "Device '%s' is not inserted", dev);
|
||||||
|
break;
|
||||||
|
case -ENOTSUP:
|
||||||
|
error_setg(errp,
|
||||||
|
"Device '%s' does not support internal snapshots",
|
||||||
|
dev);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error_setg_errno(errp, -sn_count,
|
||||||
|
"Can't list snapshots of device '%s'", dev);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return sn_count;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < sn_count; i++) {
|
for (i = 0; i < sn_count; i++) {
|
||||||
info->has_snapshots = true;
|
info = g_new0(SnapshotInfo, 1);
|
||||||
info_list = g_new0(SnapshotInfoList, 1);
|
info->id = g_strdup(sn_tab[i].id_str);
|
||||||
|
info->name = g_strdup(sn_tab[i].name);
|
||||||
|
info->vm_state_size = sn_tab[i].vm_state_size;
|
||||||
|
info->date_sec = sn_tab[i].date_sec;
|
||||||
|
info->date_nsec = sn_tab[i].date_nsec;
|
||||||
|
info->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
|
||||||
|
info->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
|
||||||
|
|
||||||
info_list->value = g_new0(SnapshotInfo, 1);
|
info_list = g_new0(SnapshotInfoList, 1);
|
||||||
info_list->value->id = g_strdup(sn_tab[i].id_str);
|
info_list->value = info;
|
||||||
info_list->value->name = g_strdup(sn_tab[i].name);
|
|
||||||
info_list->value->vm_state_size = sn_tab[i].vm_state_size;
|
|
||||||
info_list->value->date_sec = sn_tab[i].date_sec;
|
|
||||||
info_list->value->date_nsec = sn_tab[i].date_nsec;
|
|
||||||
info_list->value->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
|
|
||||||
info_list->value->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
|
|
||||||
|
|
||||||
/* XXX: waiting for the qapi to support qemu-queue.h types */
|
/* XXX: waiting for the qapi to support qemu-queue.h types */
|
||||||
if (!cur_item) {
|
if (!cur_item) {
|
||||||
info->snapshots = cur_item = info_list;
|
head = cur_item = info_list;
|
||||||
} else {
|
} else {
|
||||||
cur_item->next = info_list;
|
cur_item->next = info_list;
|
||||||
cur_item = info_list;
|
cur_item = info_list;
|
||||||
|
@ -57,6 +84,8 @@ void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(sn_tab);
|
g_free(sn_tab);
|
||||||
|
*p_list = head;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_collect_image_info(BlockDriverState *bs,
|
void bdrv_collect_image_info(BlockDriverState *bs,
|
||||||
|
|
|
@ -29,7 +29,9 @@
|
||||||
#include "block/block.h"
|
#include "block/block.h"
|
||||||
#include "block/snapshot.h"
|
#include "block/snapshot.h"
|
||||||
|
|
||||||
void bdrv_collect_snapshots(BlockDriverState *bs , ImageInfo *info);
|
int bdrv_query_snapshot_info_list(BlockDriverState *bs,
|
||||||
|
SnapshotInfoList **p_list,
|
||||||
|
Error **errp);
|
||||||
void bdrv_collect_image_info(BlockDriverState *bs,
|
void bdrv_collect_image_info(BlockDriverState *bs,
|
||||||
ImageInfo *info,
|
ImageInfo *info,
|
||||||
const char *filename);
|
const char *filename);
|
||||||
|
|
|
@ -1667,7 +1667,10 @@ static ImageInfoList *collect_image_info_list(const char *filename,
|
||||||
|
|
||||||
info = g_new0(ImageInfo, 1);
|
info = g_new0(ImageInfo, 1);
|
||||||
bdrv_collect_image_info(bs, info, filename);
|
bdrv_collect_image_info(bs, info, filename);
|
||||||
bdrv_collect_snapshots(bs, info);
|
bdrv_query_snapshot_info_list(bs, &info->snapshots, NULL);
|
||||||
|
if (info->snapshots) {
|
||||||
|
info->has_snapshots = true;
|
||||||
|
}
|
||||||
|
|
||||||
elem = g_new0(ImageInfoList, 1);
|
elem = g_new0(ImageInfoList, 1);
|
||||||
elem->value = info;
|
elem->value = info;
|
||||||
|
|
Loading…
Reference in New Issue