All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
To: "Jorge Lucángeli Obes" <t4m5yn-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH 1/4][RFC] Allow storing arbitrary annotations in	qcow2 images
Date: Wed, 08 Aug 2007 14:47:08 -0500	[thread overview]
Message-ID: <46BA1DBC.4050307@codemonkey.ws> (raw)
In-Reply-To: <59abf66e0708081121s56fc2c01vb762850b6f5eeb7a-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

This should go through qemu-devel BTW.  Please submit there and I'll 
provide comments.

Regards,

Anthony Liguori

Jorge Lucángeli Obes wrote:
> This patch adds an extra 'annot' field to qcow2 snapshots, and updates
> serialization functions.
>
> Signed-off-by: Jorge Lucángeli Obes <t4m5yn-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
> diff --git a/qemu/block-qcow2.c b/qemu/block-qcow2.c
> index 0f7a069..361d300 100644
> --- a/qemu/block-qcow2.c
> +++ b/qemu/block-qcow2.c
> @@ -106,6 +106,8 @@ typedef struct QCowSnapshot {
>      uint32_t l1_size;
>      char *id_str;
>      char *name;
> +    char *annot;
> +
>      uint32_t vm_state_size;
>      uint32_t date_sec;
>      uint32_t date_nsec;
> @@ -1370,6 +1372,7 @@ static void qcow_free_snapshots(BlockDriverState *bs)
>      for(i = 0; i < s->nb_snapshots; i++) {
>          qemu_free(s->snapshots[i].name);
>          qemu_free(s->snapshots[i].id_str);
> +        qemu_free(s->snapshots[i].annot);
>      }
>      qemu_free(s->snapshots);
>      s->snapshots = NULL;
> @@ -1401,12 +1404,18 @@ static int qcow_read_snapshots(BlockDriverState *bs)
>          sn->date_sec = be32_to_cpu(h.date_sec);
>          sn->date_nsec = be32_to_cpu(h.date_nsec);
>          sn->vm_clock_nsec = be64_to_cpu(h.vm_clock_nsec);
> -        extra_data_size = be32_to_cpu(h.extra_data_size);
>
> +        extra_data_size = be32_to_cpu(h.extra_data_size);
>          id_str_size = be16_to_cpu(h.id_str_size);
>          name_size = be16_to_cpu(h.name_size);
>
> +        sn->annot = qemu_malloc(extra_data_size + 1);
> +        if (!sn->annot)
> +            goto fail;
> +        if (bdrv_pread(s->hd, offset, sn->annot, extra_data_size) !=
> extra_data_size)
> +            goto fail;
>          offset += extra_data_size;
> +        sn->annot[extra_data_size] = '\0';
>
>          sn->id_str = qemu_malloc(id_str_size + 1);
>          if (!sn->id_str)
> @@ -1439,7 +1448,7 @@ static int qcow_write_snapshots(BlockDriverState *bs)
>      QCowSnapshotHeader h;
>      int i, name_size, id_str_size, snapshots_size;
>      uint64_t data64;
> -    uint32_t data32;
> +    uint32_t data32, extra_data_size;
>      int64_t offset, snapshots_offset;
>
>      /* compute the size of the snapshots */
> @@ -1448,6 +1457,7 @@ static int qcow_write_snapshots(BlockDriverState *bs)
>          sn = s->snapshots + i;
>          offset = align_offset(offset, 8);
>          offset += sizeof(h);
> +        offset += strlen(sn->annot);
>          offset += strlen(sn->id_str);
>          offset += strlen(sn->name);
>      }
> @@ -1455,7 +1465,7 @@ static int qcow_write_snapshots(BlockDriverState *bs)
>
>      snapshots_offset = alloc_clusters(bs, snapshots_size);
>      offset = snapshots_offset;
> -
> +
>      for(i = 0; i < s->nb_snapshots; i++) {
>          sn = s->snapshots + i;
>          memset(&h, 0, sizeof(h));
> @@ -1465,7 +1475,9 @@ static int qcow_write_snapshots(BlockDriverState *bs)
>          h.date_sec = cpu_to_be32(sn->date_sec);
>          h.date_nsec = cpu_to_be32(sn->date_nsec);
>          h.vm_clock_nsec = cpu_to_be64(sn->vm_clock_nsec);
> -
> +
> +        extra_data_size = strlen(sn->annot);
> +        h.extra_data_size = cpu_to_be32(extra_data_size);
>          id_str_size = strlen(sn->id_str);
>          name_size = strlen(sn->name);
>          h.id_str_size = cpu_to_be16(id_str_size);
> @@ -1474,6 +1486,9 @@ static int qcow_write_snapshots(BlockDriverState *bs)
>          if (bdrv_pwrite(s->hd, offset, &h, sizeof(h)) != sizeof(h))
>              goto fail;
>          offset += sizeof(h);
> +        if (bdrv_pwrite(s->hd, offset, sn->annot, extra_data_size) !=
> extra_data_size)
> +            goto fail;
> +        offset += extra_data_size;
>          if (bdrv_pwrite(s->hd, offset, sn->id_str, id_str_size) != id_str_size)
>              goto fail;
>          offset += id_str_size;
> @@ -1570,6 +1585,10 @@ static int qcow_snapshot_create(BlockDriverState *bs,
>      sn->name = qemu_strdup(sn_info->name);
>      if (!sn->name)
>          goto fail;
> +    sn->annot = qemu_strdup(sn_info->annot);
> +    if (!sn->annot)
> +        goto fail;
> +
>      sn->vm_state_size = sn_info->vm_state_size;
>      sn->date_sec = sn_info->date_sec;
>      sn->date_nsec = sn_info->date_nsec;
> @@ -1680,6 +1699,8 @@ static int qcow_snapshot_delete(BlockDriverState
> *bs, const char *snapshot_id)
>
>      qemu_free(sn->id_str);
>      qemu_free(sn->name);
> +    qemu_free(sn->annot);
> +
>      memmove(sn, sn + 1, (s->nb_snapshots - snapshot_index - 1) * sizeof(*sn));
>      s->nb_snapshots--;
>      ret = qcow_write_snapshots(bs);
> @@ -1707,10 +1728,14 @@ static int qcow_snapshot_list(BlockDriverState *bs,
>      for(i = 0; i < s->nb_snapshots; i++) {
>          sn_info = sn_tab + i;
>          sn = s->snapshots + i;
> +
>          pstrcpy(sn_info->id_str, sizeof(sn_info->id_str),
>                  sn->id_str);
>          pstrcpy(sn_info->name, sizeof(sn_info->name),
>                  sn->name);
> +        pstrcpy(sn_info->annot, sizeof(sn_info->annot),
> +                sn->annot);
> +
>          sn_info->vm_state_size = sn->vm_state_size;
>          sn_info->date_sec = sn->date_sec;
>          sn_info->date_nsec = sn->date_nsec;
> diff --git a/qemu/vl.h b/qemu/vl.h
> index 43f56bd..f0273fd 100644
> --- a/qemu/vl.h
> +++ b/qemu/vl.h
> @@ -589,6 +589,7 @@ typedef struct QEMUSnapshotInfo {
>      /* the following fields are informative. They are not needed for
>         the consistency of the snapshot */
>      char name[256]; /* user choosen name */
> +    char annot[1024]; /* extra info, will be used to store
> command-line parameters */
>      uint32_t vm_state_size; /* VM state info size */
>      uint32_t date_sec; /* UTC date of the snapshot */
>      uint32_t date_nsec;
> @@ -631,6 +632,7 @@ int bdrv_pread(BlockDriverState *bs, int64_t offset,
>  int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
>                  const void *buf, int count);
>  int bdrv_truncate(BlockDriverState *bs, int64_t offset);
> +
>  int64_t bdrv_getlength(BlockDriverState *bs);
>  void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr);
>  int bdrv_commit(BlockDriverState *bs);
> @@ -714,6 +716,12 @@ void path_combine(char *dest, int dest_size,
>                    const char *base_path,
>                    const char *filename);
>
> +/* annotations */
> +int bdrv_snapshot_annotated(QEMUSnapshotInfo *sn_info);
> +int bdrv_set_annot(BlockDriverState *bs, const char *name,
> +                   const char *annotation);
> +char *bdrv_get_annot(BlockDriverState *bs, const char *name);
> +
>  #ifndef QEMU_TOOL
>
>  typedef void QEMUMachineInitFunc(int ram_size, int vga_ram_size,
>   
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >>  http://get.splunk.com/
> ------------------------------------------------------------------------
>
> _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

  parent reply	other threads:[~2007-08-08 19:47 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-08 18:21 [PATCH 1/4][RFC] Allow storing arbitrary annotations in qcow2 images Jorge Lucángeli Obes
     [not found] ` <59abf66e0708081121s56fc2c01vb762850b6f5eeb7a-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-08-08 19:47   ` Anthony Liguori [this message]
2007-08-08 19:50 ` [Qemu-devel] " Jorge Lucángeli Obes

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=46BA1DBC.4050307@codemonkey.ws \
    --to=anthony-rdkfgonbjusknkdkm+me6a@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=t4m5yn-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.