qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, phrdina@redhat.com,
	Wenchao Xia <xiawenc@linux.vnet.ibm.com>,
	armbru@redhat.com, lcapitulino@redhat.com, stefanha@redhat.com,
	pbonzini@redhat.com, dietmar@proxmox.com
Subject: [Qemu-devel] [PATCH 05/11] snapshot: add paired functions for internal snapshot id and name
Date: Sat,  8 Jun 2013 14:58:01 +0800	[thread overview]
Message-ID: <1370674687-13849-6-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1370674687-13849-1-git-send-email-xiawenc@linux.vnet.ibm.com>

Internal snapshot's ID and name concept are both visible in general
block level, they are observed by user in "info snapshots", so it is
possible to mess them up. Although we can separate the two concept in
programming, but if they can be distinguished in string itself, things
will be simple and clear, so introduce two functions to do it.

The implemention, qcow2 snapshot calls snapshot_id_string_generate() to
make sure it follows the rule in driver. If caller or user give a check
with snapshot_name_wellformed() before create snapshot, then the ID
and name will never mess up. The check can be also taken in
qcow2_snapshot_create(), but require it to return error reason.

For rbd, it have no ID, so have no impact.
For sheepdog, ID can't be determined in qemu, so still can't guarantee
that no more mess up for ID and name.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 block/qcow2-snapshot.c   |    2 +-
 block/snapshot.c         |   33 +++++++++++++++++++++++++++++++++
 include/block/snapshot.h |    3 +++
 3 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index 992a5c8..7108d46 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -284,7 +284,7 @@ static void find_new_snapshot_id(BlockDriverState *bs,
         if (id > id_max)
             id_max = id;
     }
-    snprintf(id_str, id_str_size, "%d", id_max + 1);
+    snapshot_id_string_generate(id_max + 1, id_str, id_str_size);
 }
 
 static int find_snapshot_by_id(BlockDriverState *bs, const char *id_str)
diff --git a/block/snapshot.c b/block/snapshot.c
index 0a9af4e..6fa59e0 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -229,3 +229,36 @@ int bdrv_snapshot_load_tmp(BlockDriverState *bs,
     }
     return -ENOTSUP;
 }
+
+/*
+ * Every internal snapshot have an ID used by qemu block layer, this function
+ * check whether name used by user mess up with ID. An empty string is also
+ * invalid.
+ */
+bool snapshot_name_wellformed(const char *name)
+{
+    char *p;
+    /* variable v is used to remove gcc warning of "ignoring return value" and
+       "set but not used" */
+    unsigned long v;
+
+    if (*name == '\0') {
+        return false;
+    }
+
+    v = strtoul(name, &p, 10);
+    v++;
+
+    if (*p == '\0') {
+        /* Numeric string */
+        return false;
+    }
+    return true;
+}
+
+/* Following function generate id string, used by block driver, such as qcow2.
+   Since no better place to go, place the funtion here for now. */
+void snapshot_id_string_generate(int id, char *id_str, int id_str_size)
+{
+    snprintf(id_str, id_str_size, "%d", id);
+}
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index 9d06dc1..3d93719 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -56,4 +56,7 @@ int bdrv_snapshot_list(BlockDriverState *bs,
                        QEMUSnapshotInfo **psn_info);
 int bdrv_snapshot_load_tmp(BlockDriverState *bs,
                            const char *snapshot_name);
+
+bool snapshot_name_wellformed(const char *name);
+void snapshot_id_string_generate(int id, char *id_str, int id_str_size);
 #endif
-- 
1.7.1

  parent reply	other threads:[~2013-06-08  7:01 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-08  6:57 [Qemu-devel] [PATCH 00/11] add internal snapshot support at block device level Wenchao Xia
2013-06-08  6:57 ` [Qemu-devel] [PATCH 01/11] blockdev: drop redundant proto_drv check Wenchao Xia
2013-06-08  6:57 ` [Qemu-devel] [PATCH 02/11] blockdev: rename BlkTransactionStates to singular Wenchao Xia
2013-06-08  6:57 ` [Qemu-devel] [PATCH 03/11] blockdev: allow BdrvActionOps->commit() to be NULL Wenchao Xia
2013-06-08  6:58 ` [Qemu-devel] [PATCH 04/11] snapshot: new function bdrv_snapshot_find_by_id_and_name() Wenchao Xia
2013-06-08  7:31   ` Fam Zheng
2013-06-08  7:58     ` Wenchao Xia
2013-06-08  8:35       ` Fam Zheng
2013-06-09  2:33         ` Wenchao Xia
2013-06-11  8:26   ` Stefan Hajnoczi
2013-06-13  3:34     ` Wenchao Xia
2013-06-08  6:58 ` Wenchao Xia [this message]
2013-06-11  9:14   ` [Qemu-devel] [PATCH 05/11] snapshot: add paired functions for internal snapshot id and name Stefan Hajnoczi
2013-06-13  5:33     ` Wenchao Xia
2013-06-13  8:30       ` Stefan Hajnoczi
2013-06-08  6:58 ` [Qemu-devel] [PATCH 06/11] snapshot: distinguish id and name in snapshot delete Wenchao Xia
2013-06-08  7:54   ` Fam Zheng
2013-06-11  9:25   ` Stefan Hajnoczi
2013-06-13  5:41     ` Wenchao Xia
2013-06-08  6:58 ` [Qemu-devel] [PATCH 07/11] qmp: add internal snapshot support in qmp_transaction Wenchao Xia
2013-06-08  6:58 ` [Qemu-devel] [PATCH 08/11] qmp: add interface blockdev-snapshot-internal-sync Wenchao Xia
2013-06-08  8:05   ` Fam Zheng
2013-06-09  2:35     ` Wenchao Xia
2013-06-08  6:58 ` [Qemu-devel] [PATCH 09/11] qmp: add interface blockdev-snapshot-delete-internal-sync Wenchao Xia
2013-06-08  6:58 ` [Qemu-devel] [PATCH 10/11] hmp: add interface hmp_snapshot_internal_blkdev Wenchao Xia
2013-06-08  8:21   ` Fam Zheng
2013-06-09  2:39     ` Wenchao Xia
2013-06-09  3:01       ` Fam Zheng
2013-06-08  6:58 ` [Qemu-devel] [PATCH 11/11] hmp: add interface hmp_snapshot_delete_internal_blkdev Wenchao Xia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1370674687-13849-6-git-send-email-xiawenc@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=armbru@redhat.com \
    --cc=dietmar@proxmox.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=phrdina@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).