* [Qemu-devel] [PATCH 2/4][RFC] Add functions to manipulate image annotations
[not found] <59abf66e0708081122k65fd4670y3db5659bc6ea0aa9@mail.gmail.com>
@ 2007-08-08 19:51 ` Jorge Lucángeli Obes
0 siblings, 0 replies; only message in thread
From: Jorge Lucángeli Obes @ 2007-08-08 19:51 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 4045 bytes --]
This patch adds block driver functions to use qcow2 image annotations.
Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
Signed-off-by: Jorge Lucángeli Obes <t4m5yn@gmail.com>
---
diff --git a/qemu/block.c b/qemu/block.c
index 39ec37a..4d794f6 100644
--- a/qemu/block.c
+++ b/qemu/block.c
@@ -56,6 +56,8 @@ static int bdrv_write_em(BlockDriverState *bs,
int64_t sector_num,
static BlockDriverState *bdrv_first;
static BlockDriver *first_drv;
+static char *filter_name(char *name);
+
int path_is_absolute(const char *path)
{
const char *p;
@@ -1037,6 +1039,8 @@ char *bdrv_snapshot_dump(char *buf, int
buf_size, QEMUSnapshotInfo *sn)
snprintf(buf, buf_size,
"%-10s%-20s%7s%20s%15s",
"ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
+ } else if (bdrv_snapshot_annotated(sn)) {
+ snprintf(buf, buf_size, "%s: '%s'", filter_name(sn->name), sn->annot);
} else {
ti = sn->date_sec;
#ifdef _WIN32
@@ -1361,3 +1365,128 @@ void bdrv_set_locked(BlockDriverState *bs, int locked)
drv->bdrv_set_locked(bs, locked);
}
}
+
+/**************************************************************/
+/* image annotation support */
+
+static char *prepare_name(const char *name)
+{
+ char *res = malloc(1024 * sizeof(char));
+
+ res[0] = '\n';
+ return strncat(res, name, 1022);
+}
+
+static char *filter_name(char *name)
+{
+ return strtok(name, "\n");
+}
+
+int bdrv_snapshot_annotated(QEMUSnapshotInfo *sn)
+{
+ return (sn->name[0] == '\n' &&
+ sn->vm_state_size == 0 &&
+ *sn->annot != '\0');
+}
+
+int bdrv_set_annot(BlockDriverState *bs,
+ const char *name,
+ const char *annotation)
+{
+ int nbsnaps, i;
+ int ret = 0;
+
+ char *fltname;
+ char *prepname;
+ char *id_annot = NULL;
+
+ QEMUSnapshotInfo *sn_info;
+ BlockDriver *drv = bs->drv;
+
+ nbsnaps = drv->bdrv_snapshot_list(bs, &sn_info);
+
+ if (nbsnaps < 0) {
+ ret = -1;
+ goto end;
+ }
+
+ for (i = 0; i < nbsnaps; i++) {
+ fltname = filter_name(sn_info[i].name);
+
+ if (sn_info[i].name[0] == '\n' &&
+ !strcmp(fltname, name) &&
+ sn_info[i].vm_state_size == 0) {
+
+ id_annot = sn_info[i].id_str;
+ break;
+ }
+ }
+
+ if (id_annot != NULL)
+ drv->bdrv_snapshot_delete(bs, id_annot);
+
+ if (strlen(annotation) == 0)
+ goto end;
+
+ QEMUSnapshotInfo *new_sn_info = qemu_malloc(sizeof(QEMUSnapshotInfo));
+
+ if (!new_sn_info) {
+ ret = -ENOMEM;
+ goto end;
+ }
+
+ prepname = prepare_name(name);
+
+ // No id, set by create
+ new_sn_info->id_str[0] = '\0';
+ pstrcpy(new_sn_info->name, 1024, prepname);
+ pstrcpy(new_sn_info->annot, 1024, annotation);
+
+ new_sn_info->vm_state_size = new_sn_info->date_sec =
+ new_sn_info->date_nsec = new_sn_info->vm_clock_nsec = 0;
+
+ if (drv->bdrv_snapshot_create(bs, new_sn_info) < 0)
+ ret = -1;
+
+ free(prepname);
+ free(new_sn_info);
+
+end:
+ free(sn_info);
+ return ret;
+}
+
+char *bdrv_get_annot(BlockDriverState *bs, const char *name)
+{
+ int nbsnaps, i;
+ char *filteredn;
+ char *res;
+
+ QEMUSnapshotInfo *sn_info = NULL;
+
+ res = malloc(1024 * sizeof(char));
+ if (!res)
+ return NULL;
+
+ nbsnaps = bs->drv->bdrv_snapshot_list(bs, &sn_info);
+
+ if (nbsnaps < 0) {
+ free(sn_info);
+ free(res);
+ return NULL;
+ }
+
+ for (i = 0; i < nbsnaps; i++) {
+ filteredn = filter_name(sn_info[i].name);
+
+ if (sn_info[i].name[0] == '\n' &&
+ !strcmp(filteredn, name) &&
+ sn_info[i].vm_state_size == 0) {
+
+ pstrcpy(res, 1024, sn_info[i].annot);
+ break;
+ }
+ }
+
+ return res;
+}
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: block-drv-functions.patch --]
[-- Type: text/x-patch; name=block-drv-functions.patch; charset=ANSI_X3.4-1968, Size: 3937 bytes --]
This patch adds block driver functions to use qcow2 image annotations.
Signed-off-by: Laurent Vivier <Laurent.Vivier@bull.net>
Signed-off-by: Jorge Lucángeli Obes <t4m5yn@gmail.com>
---
diff --git a/qemu/block.c b/qemu/block.c
index 39ec37a..4d794f6 100644
--- a/qemu/block.c
+++ b/qemu/block.c
@@ -56,6 +56,8 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
static BlockDriverState *bdrv_first;
static BlockDriver *first_drv;
+static char *filter_name(char *name);
+
int path_is_absolute(const char *path)
{
const char *p;
@@ -1037,6 +1039,8 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
snprintf(buf, buf_size,
"%-10s%-20s%7s%20s%15s",
"ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
+ } else if (bdrv_snapshot_annotated(sn)) {
+ snprintf(buf, buf_size, "%s: '%s'", filter_name(sn->name), sn->annot);
} else {
ti = sn->date_sec;
#ifdef _WIN32
@@ -1361,3 +1365,128 @@ void bdrv_set_locked(BlockDriverState *bs, int locked)
drv->bdrv_set_locked(bs, locked);
}
}
+
+/**************************************************************/
+/* image annotation support */
+
+static char *prepare_name(const char *name)
+{
+ char *res = malloc(1024 * sizeof(char));
+
+ res[0] = '\n';
+ return strncat(res, name, 1022);
+}
+
+static char *filter_name(char *name)
+{
+ return strtok(name, "\n");
+}
+
+int bdrv_snapshot_annotated(QEMUSnapshotInfo *sn)
+{
+ return (sn->name[0] == '\n' &&
+ sn->vm_state_size == 0 &&
+ *sn->annot != '\0');
+}
+
+int bdrv_set_annot(BlockDriverState *bs,
+ const char *name,
+ const char *annotation)
+{
+ int nbsnaps, i;
+ int ret = 0;
+
+ char *fltname;
+ char *prepname;
+ char *id_annot = NULL;
+
+ QEMUSnapshotInfo *sn_info;
+ BlockDriver *drv = bs->drv;
+
+ nbsnaps = drv->bdrv_snapshot_list(bs, &sn_info);
+
+ if (nbsnaps < 0) {
+ ret = -1;
+ goto end;
+ }
+
+ for (i = 0; i < nbsnaps; i++) {
+ fltname = filter_name(sn_info[i].name);
+
+ if (sn_info[i].name[0] == '\n' &&
+ !strcmp(fltname, name) &&
+ sn_info[i].vm_state_size == 0) {
+
+ id_annot = sn_info[i].id_str;
+ break;
+ }
+ }
+
+ if (id_annot != NULL)
+ drv->bdrv_snapshot_delete(bs, id_annot);
+
+ if (strlen(annotation) == 0)
+ goto end;
+
+ QEMUSnapshotInfo *new_sn_info = qemu_malloc(sizeof(QEMUSnapshotInfo));
+
+ if (!new_sn_info) {
+ ret = -ENOMEM;
+ goto end;
+ }
+
+ prepname = prepare_name(name);
+
+ // No id, set by create
+ new_sn_info->id_str[0] = '\0';
+ pstrcpy(new_sn_info->name, 1024, prepname);
+ pstrcpy(new_sn_info->annot, 1024, annotation);
+
+ new_sn_info->vm_state_size = new_sn_info->date_sec =
+ new_sn_info->date_nsec = new_sn_info->vm_clock_nsec = 0;
+
+ if (drv->bdrv_snapshot_create(bs, new_sn_info) < 0)
+ ret = -1;
+
+ free(prepname);
+ free(new_sn_info);
+
+end:
+ free(sn_info);
+ return ret;
+}
+
+char *bdrv_get_annot(BlockDriverState *bs, const char *name)
+{
+ int nbsnaps, i;
+ char *filteredn;
+ char *res;
+
+ QEMUSnapshotInfo *sn_info = NULL;
+
+ res = malloc(1024 * sizeof(char));
+ if (!res)
+ return NULL;
+
+ nbsnaps = bs->drv->bdrv_snapshot_list(bs, &sn_info);
+
+ if (nbsnaps < 0) {
+ free(sn_info);
+ free(res);
+ return NULL;
+ }
+
+ for (i = 0; i < nbsnaps; i++) {
+ filteredn = filter_name(sn_info[i].name);
+
+ if (sn_info[i].name[0] == '\n' &&
+ !strcmp(filteredn, name) &&
+ sn_info[i].vm_state_size == 0) {
+
+ pstrcpy(res, 1024, sn_info[i].annot);
+ break;
+ }
+ }
+
+ return res;
+}
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2007-08-08 19:51 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <59abf66e0708081122k65fd4670y3db5659bc6ea0aa9@mail.gmail.com>
2007-08-08 19:51 ` [Qemu-devel] [PATCH 2/4][RFC] Add functions to manipulate image annotations Jorge Lucángeli Obes
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).