[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
>
>
- [Qemu-devel] [RFC PATCH v2 09/23] qcow2: Clean up handle_alloc(), (continued)
- [Qemu-devel] [RFC PATCH v2 09/23] qcow2: Clean up handle_alloc(), Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 08/23] qcow2: Finalise interface of handle_alloc(), Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 07/23] qcow2: handle_alloc(): Get rid of keep_clusters parameter, Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 12/23] qcow2: handle_copied(): Get rid of keep_clusters parameter, Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 11/23] qcow2: handle_copied(): Get rid of nb_clusters parameter, Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 06/23] qcow2: handle_alloc(): Get rid of nb_clusters parameter, Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 15/23] qcow2: Allow requests with multiple l2metas, Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 10/23] qcow2: Factor out handle_copied(), Kevin Wolf, 2013/02/13
- [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset, Kevin Wolf, 2013/02/13
- Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset,
Blue Swirl <=
[Qemu-devel] [RFC PATCH v2 16/23] qcow2: Reading from areas not in L2 tables yet, Kevin Wolf, 2013/02/13
[Qemu-devel] [RFC PATCH v2 18/23] qcow2: Delay the COW, Kevin Wolf, 2013/02/13
[Qemu-devel] [RFC PATCH v2 19/23] qcow2: Add error handling to the l2meta coroutine, Kevin Wolf, 2013/02/13