qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement


From: Blue Swirl
Subject: Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
Date: Wed, 13 Feb 2013 21:17:11 +0000

On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf <address@hidden> wrote:
> Look only for clusters that start at a given physical offset.
>
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  block/qcow2-cluster.c |   26 ++++++++++++++++++--------
>  1 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
> index 5ce2c88..90fe36c 100644
> --- a/block/qcow2-cluster.c
> +++ b/block/qcow2-cluster.c
> @@ -827,8 +827,6 @@ static int handle_dependencies(BlockDriverState *bs, 
> uint64_t guest_offset,
>   *          the length of the area that can be written to.
>   *
>   *  -errno: in error cases
> - *
> - * TODO Make non-zero host_offset behave like describe above
>   */
>  static int handle_copied(BlockDriverState *bs, uint64_t guest_offset,
>      uint64_t *host_offset, uint64_t *bytes, QCowL2Meta **m)
> @@ -843,7 +841,6 @@ static int handle_copied(BlockDriverState *bs, uint64_t 
> guest_offset,
>
>      trace_qcow2_handle_copied(qemu_coroutine_self(), guest_offset, 
> *host_offset,
>                                *bytes);
> -    assert(*host_offset == 0);
>
>      /*
>       * Calculate the number of clusters to look for. We stop at L2 table
> @@ -867,6 +864,15 @@ static int handle_copied(BlockDriverState *bs, uint64_t 
> guest_offset,
>      if (qcow2_get_cluster_type(cluster_offset) == QCOW2_CLUSTER_NORMAL
>          && (cluster_offset & QCOW_OFLAG_COPIED))
>      {
> +        /* If a specific host_offset is required, check it */
> +        if (*host_offset != 0
> +            && (cluster_offset & L2E_OFFSET_MASK) != *host_offset)
> +        {

Braces should cuddle with the previous line.

> +            *bytes = 0;
> +            ret = 0;
> +            goto out;
> +        }
> +
>          /* We keep all QCOW_OFLAG_COPIED clusters */
>          keep_clusters =
>              count_contiguous_clusters(nb_clusters, s->cluster_size,
> @@ -880,19 +886,22 @@ static int handle_copied(BlockDriverState *bs, uint64_t 
> guest_offset,
>
>          ret = 1;
>      } else {
> -        cluster_offset = 0;
>          ret = 0;
>      }
>
> -    cluster_offset &= L2E_OFFSET_MASK;
> -    *host_offset = cluster_offset;
> -
>      /* Cleanup */
> +out:
>      pret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
>      if (pret < 0) {
>          return pret;
>      }
>
> +    /* Only return a host offset if we actually made progress. Otherwise we
> +     * would make requirements for handle_alloc() that it can't fulfill */
> +    if (ret) {
> +        *host_offset = cluster_offset & L2E_OFFSET_MASK;
> +    }
> +
>      return ret;
>  }
>
> @@ -1162,7 +1171,6 @@ again:
>
>      /*
>       * 2. Count contiguous COPIED clusters.
> -     *    TODO: Consider cluster_offset if set in step 1c.
>       */
>      ret = handle_copied(bs, offset, &cluster_offset, &cur_bytes, m);
>      if (ret < 0) {
> @@ -1175,6 +1183,8 @@ again:
>          if (!*host_offset) {
>              *host_offset = cluster_offset;
>          }
> +    } else if (cur_bytes == 0) {
> +        goto done;
>      } else {
>          keep_clusters = 0;
>      }
> --
> 1.7.6.5
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]