From patchwork Wed Jan 9 05:12:22 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 210616 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 59F1C2C00C8 for ; Wed, 9 Jan 2013 16:15:06 +1100 (EST) Received: from localhost ([::1]:34487 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tso0G-0006pc-A5 for incoming@patchwork.ozlabs.org; Wed, 09 Jan 2013 00:15:04 -0500 Received: from eggs.gnu.org ([208.118.235.92]:55271) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tsnzk-0005uo-Tx for qemu-devel@nongnu.org; Wed, 09 Jan 2013 00:14:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tsnzj-0008C5-Ak for qemu-devel@nongnu.org; Wed, 09 Jan 2013 00:14:32 -0500 Received: from e28smtp07.in.ibm.com ([122.248.162.7]:44464) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tsnzi-00086y-FE for qemu-devel@nongnu.org; Wed, 09 Jan 2013 00:14:31 -0500 Received: from /spool/local by e28smtp07.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 9 Jan 2013 10:43:06 +0530 Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp07.in.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 9 Jan 2013 10:43:06 +0530 Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id C63A5394004C for ; Wed, 9 Jan 2013 10:44:26 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r095EOd346923794 for ; Wed, 9 Jan 2013 10:44:24 +0530 Received: from d28av04.in.ibm.com (loopback [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r095EQIC019325 for ; Wed, 9 Jan 2013 16:14:26 +1100 Received: from RH63Wenchao ([9.77.181.189]) by d28av04.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r095Ch67014023; Wed, 9 Jan 2013 16:14:23 +1100 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Wed, 9 Jan 2013 13:12:22 +0800 Message-Id: <1357708350-9917-4-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1357708350-9917-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1357708350-9917-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13010905-8878-0000-0000-000005719FE6 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.7 Cc: aliguori@us.ibm.com, phrdina@redhat.com, stefanha@gmail.com, armbru@redhat.com, lcapitulino@redhat.com, pbonzini@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH V2 03/11] block: add snapshot and image info query function X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This patch added function bdrv_query_image_info() and bdrv_query_snapshot_infolist(), which will return info in qmp object format. The implemetion code are mostly copied from collect_image_info() and collect_snapshot() in qemu-img.c. To help filter out snapshot info not needed, a call back function is added in bdrv_query_snapshot_infolist(). v2: Seperate patch for adding these functions. Spelling fix. Coding style fix due to comments from Eric. Signed-off-by: Wenchao Xia Reviewed-by: Eric Blake --- block.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++ include/block/block.h | 9 ++++ 2 files changed, 126 insertions(+), 0 deletions(-) diff --git a/block.c b/block.c index 5f95da5..81765a3 100644 --- a/block.c +++ b/block.c @@ -2846,6 +2846,123 @@ int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top, return 0; } +SnapshotInfoList *bdrv_query_snapshot_infolist(BlockDriverState *bs, + SnapshotFilterFunc filter, + void *opaque, + Error **errp) +{ + int i, sn_count; + QEMUSnapshotInfo *sn_tab = NULL; + SnapshotInfoList *info_list, *cur_item = NULL, *head = NULL; + sn_count = bdrv_snapshot_list(bs, &sn_tab); + if (sn_count < 0) { + if (errp != NULL) { + error_setg(errp, "bdrv_snapshot_list: error %d\n", sn_count); + } + return NULL; + } + + for (i = 0; i < sn_count; i++) { + if (filter && filter(&sn_tab[i], opaque) != 0) { + continue; + } + + info_list = g_new0(SnapshotInfoList, 1); + + info_list->value = g_new0(SnapshotInfo, 1); + info_list->value->id = g_strdup(sn_tab[i].id_str); + 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 */ + if (!cur_item) { + head = cur_item = info_list; + } else { + cur_item->next = info_list; + cur_item = info_list; + } + + } + + g_free(sn_tab); + return head; +} + +/* collect all internal snapshot info in a image for ImageInfo */ +static void collect_snapshots_info(BlockDriverState *bs, + ImageInfo *info, + Error **errp) +{ + SnapshotInfoList *info_list; + + info_list = bdrv_query_snapshot_infolist(bs, NULL, NULL, errp); + if (info_list != NULL) { + info->has_snapshots = true; + info->snapshots = info_list; + } + return; +} + +static void collect_image_info(BlockDriverState *bs, + ImageInfo *info) +{ + uint64_t total_sectors; + char backing_filename[1024]; + char backing_filename2[1024]; + BlockDriverInfo bdi; + const char *filename; + + filename = bdrv_get_filename(bs); + bdrv_get_geometry(bs, &total_sectors); + + info->filename = g_strdup(filename); + info->format = g_strdup(bdrv_get_format_name(bs)); + info->virtual_size = total_sectors * 512; + info->actual_size = bdrv_get_allocated_file_size(bs); + info->has_actual_size = info->actual_size >= 0; + if (bdrv_is_encrypted(bs)) { + info->encrypted = true; + info->has_encrypted = true; + } + if (bdrv_get_info(bs, &bdi) >= 0) { + if (bdi.cluster_size != 0) { + info->cluster_size = bdi.cluster_size; + info->has_cluster_size = true; + } + info->dirty_flag = bdi.is_dirty; + info->has_dirty_flag = true; + } + bdrv_get_backing_filename(bs, backing_filename, sizeof(backing_filename)); + if (backing_filename[0] != '\0') { + info->backing_filename = g_strdup(backing_filename); + info->has_backing_filename = true; + bdrv_get_full_backing_filename(bs, backing_filename2, + sizeof(backing_filename2)); + + if (strcmp(backing_filename, backing_filename2) != 0) { + info->full_backing_filename = g_strdup(backing_filename2); + info->has_full_backing_filename = true; + } + + if (bs->backing_format[0]) { + info->backing_filename_format = g_strdup(bs->backing_format); + info->has_backing_filename_format = true; + } + } +} + +ImageInfo *bdrv_query_image_info(BlockDriverState *bs, Error **errp) +{ + ImageInfo *info = g_new0(ImageInfo, 1); + collect_image_info(bs, info); + collect_snapshots_info(bs, info, errp); + return info; +} + BlockInfo *bdrv_query_info(BlockDriverState *bs) { BlockInfo *info = g_malloc0(sizeof(*info)); diff --git a/include/block/block.h b/include/block/block.h index a0fc2a6..67f0d13 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -316,8 +316,17 @@ void bdrv_get_backing_filename(BlockDriverState *bs, char *filename, int filename_size); void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz); + +typedef int (*SnapshotFilterFunc)(const QEMUSnapshotInfo *sn, void *opaque); +/* assume bs is already opened, use qapi_free_* to free returned value. */ +SnapshotInfoList *bdrv_query_snapshot_infolist(BlockDriverState *bs, + SnapshotFilterFunc filter, + void *opaque, + Error **errp); +ImageInfo *bdrv_query_image_info(BlockDriverState *bs, Error **errp); BlockInfo *bdrv_query_info(BlockDriverState *s); BlockStats *bdrv_query_stats(const BlockDriverState *bs); + int bdrv_can_snapshot(BlockDriverState *bs); int bdrv_is_snapshot(BlockDriverState *bs); BlockDriverState *bdrv_snapshots(void);