From patchwork Sat Apr 13 08:56:31 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 236321 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 85CCD2C00C1 for ; Sat, 13 Apr 2013 19:27:16 +1000 (EST) Received: from localhost ([::1]:34062 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQwNZ-0006Jl-Ps for incoming@patchwork.ozlabs.org; Sat, 13 Apr 2013 05:04:13 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49540) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQwJm-0000Ny-5w for qemu-devel@nongnu.org; Sat, 13 Apr 2013 05:00:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQwJl-0000n5-0Y for qemu-devel@nongnu.org; Sat, 13 Apr 2013 05:00:18 -0400 Received: from e23smtp02.au.ibm.com ([202.81.31.144]:43640) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQwJk-0000mi-8H for qemu-devel@nongnu.org; Sat, 13 Apr 2013 05:00:16 -0400 Received: from /spool/local by e23smtp02.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sat, 13 Apr 2013 18:52:40 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp02.au.ibm.com (202.81.31.208) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sat, 13 Apr 2013 18:52:01 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 6D9042CE804C for ; Sat, 13 Apr 2013 18:59:34 +1000 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r3D8k3KY1507790 for ; Sat, 13 Apr 2013 18:46:03 +1000 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r3D8xWAZ026697 for ; Sat, 13 Apr 2013 18:59:33 +1000 Received: from RH63Wenchao (wenchaox.cn.ibm.com [9.115.122.157]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r3D8u24F020091; Sat, 13 Apr 2013 18:59:30 +1000 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Sat, 13 Apr 2013 16:56:31 +0800 Message-Id: <1365843407-16504-3-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1365843407-16504-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1365843407-16504-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13041308-5490-0000-0000-000003452C3C X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 202.81.31.144 Cc: kwolf@redhat.com, phrdina@redhat.com, stefanha@gmail.com, armbru@redhat.com, lcapitulino@redhat.com, pbonzini@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH V12 02/18] block: distinguish id and name in bdrv_find_snapshot() 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 To make it clear about id and name in searching, the API is changed a bit to distinguish them, and caller can choose to search by id or name. Searching will be done with higher priority of id. This function also returns negative value from bdrv_snapshot_list() instead of -ENOENT on error now. Note that the logic is changed a bit: now it traverse twice, first search for id, second for name, but original code traverse only once to search them at the same time, so matching sequence may be different. As a result, do_savevm(), del_existing_snapshots(), load_vmsate() may behaviors differently if there are unwisely chosen name mixed with id. In do_info_snapshots(), the caller is changed to search id only, which should be the correct behavior. Signed-off-by: Wenchao Xia --- block/snapshot.c | 46 ++++++++++++++++++++++++++++++++++++++-------- include/block/snapshot.h | 2 +- savevm.c | 10 +++++----- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/block/snapshot.c b/block/snapshot.c index c47a899..d57d04a 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -24,8 +24,20 @@ #include "block/snapshot.h" +/** + * Look up an internal snapshot by @id, or else by @name. + * @bs: block device to search + * @sn_info: location to store information on the snapshot found + * @id: unique snapshot ID, or NULL + * @name: snapshot name, or NULL + * + * If the snapshot with unique ID @id exists, find it. + * Else, if snapshots with name @name exists, find one of them. + * + * Returns: 0 when a snapshot is found, else -errno. + */ int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, - const char *name) + const char *id, const char *name) { QEMUSnapshotInfo *sn_tab, *sn; int nb_sns, i, ret; @@ -33,16 +45,34 @@ int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, ret = -ENOENT; nb_sns = bdrv_snapshot_list(bs, &sn_tab); if (nb_sns < 0) { - return ret; + return nb_sns; + } + + /* search by id */ + if (id) { + for (i = 0; i < nb_sns; i++) { + sn = &sn_tab[i]; + if (!strcmp(sn->id_str, id)) { + *sn_info = *sn; + ret = 0; + goto out; + } + } } - for (i = 0; i < nb_sns; i++) { - sn = &sn_tab[i]; - if (!strcmp(sn->id_str, name) || !strcmp(sn->name, name)) { - *sn_info = *sn; - ret = 0; - break; + + /* search by name */ + if (name) { + for (i = 0; i < nb_sns; i++) { + sn = &sn_tab[i]; + if (!strcmp(sn->name, name)) { + *sn_info = *sn; + ret = 0; + goto out; + } } } + + out: g_free(sn_tab); return ret; } diff --git a/include/block/snapshot.h b/include/block/snapshot.h index 4ad070c..a047a8e 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -33,5 +33,5 @@ #include "block.h" int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info, - const char *name); + const char *id, const char *name); #endif diff --git a/savevm.c b/savevm.c index 528ba0d..ed6d74c 100644 --- a/savevm.c +++ b/savevm.c @@ -2212,7 +2212,7 @@ static int del_existing_snapshots(Monitor *mon, const char *name) bs = NULL; while ((bs = bdrv_next(bs))) { if (bdrv_can_snapshot(bs) && - bdrv_snapshot_find(bs, snapshot, name) >= 0) + bdrv_snapshot_find(bs, snapshot, name, name) >= 0) { ret = bdrv_snapshot_delete(bs, name); if (ret < 0) { @@ -2272,7 +2272,7 @@ void do_savevm(Monitor *mon, const QDict *qdict) sn->vm_clock_nsec = qemu_get_clock_ns(vm_clock); if (name) { - ret = bdrv_snapshot_find(bs, old_sn, name); + ret = bdrv_snapshot_find(bs, old_sn, name, name); if (ret >= 0) { pstrcpy(sn->name, sizeof(sn->name), old_sn->name); pstrcpy(sn->id_str, sizeof(sn->id_str), old_sn->id_str); @@ -2363,7 +2363,7 @@ int load_vmstate(const char *name) } /* Don't even try to load empty VM states */ - ret = bdrv_snapshot_find(bs_vm_state, &sn, name); + ret = bdrv_snapshot_find(bs_vm_state, &sn, name, name); if (ret < 0) { return ret; } else if (sn.vm_state_size == 0) { @@ -2387,7 +2387,7 @@ int load_vmstate(const char *name) return -ENOTSUP; } - ret = bdrv_snapshot_find(bs, &sn, name); + ret = bdrv_snapshot_find(bs, &sn, name, name); if (ret < 0) { error_report("Device '%s' does not have the requested snapshot '%s'", bdrv_get_device_name(bs), name); @@ -2493,7 +2493,7 @@ void do_info_snapshots(Monitor *mon, const QDict *qdict) while ((bs1 = bdrv_next(bs1))) { if (bdrv_can_snapshot(bs1) && bs1 != bs) { - ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str); + ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str, NULL); if (ret < 0) { available = 0; break;