Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
On Fri, Feb 15, 2013 at 9:35 AM, Kevin Wolf kw...@redhat.com wrote: On Thu, Feb 14, 2013 at 09:40:22PM +, Blue Swirl wrote: On Thu, Feb 14, 2013 at 9:40 AM, Kevin Wolf kw...@redhat.com wrote: Am 13.02.2013 22:17, schrieb Blue Swirl: On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf kw...@redhat.com wrote: Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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. Can we get rid of this rule for multiline ifs? Having the second/third/... line of the condition and the first line of the then branch with no clear separation severely hurts readability in my opinion. Perhaps the problem is that the condition is long, it could be rewritten in this style: bool has_host_offset = *host_offset != 0; bool offset_matches = (cluster_offset L2E_OFFSET_MASK) != *host_offset; if (has_host_offset offset_matches) { I consider the usefulness of this about the same as adding code in order to silence gcc warnings. Just that a complaining gcc breaks the build whereas a complaining Blue Swirl doesn't. But I'll do it here. Maybe I complain too much. I think the booleans could actually make the logic clearer to someone not familiar with the code. Kevin
Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
On Thu, Feb 14, 2013 at 09:40:22PM +, Blue Swirl wrote: On Thu, Feb 14, 2013 at 9:40 AM, Kevin Wolf kw...@redhat.com wrote: Am 13.02.2013 22:17, schrieb Blue Swirl: On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf kw...@redhat.com wrote: Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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. Can we get rid of this rule for multiline ifs? Having the second/third/... line of the condition and the first line of the then branch with no clear separation severely hurts readability in my opinion. Perhaps the problem is that the condition is long, it could be rewritten in this style: bool has_host_offset = *host_offset != 0; bool offset_matches = (cluster_offset L2E_OFFSET_MASK) != *host_offset; if (has_host_offset offset_matches) { I consider the usefulness of this about the same as adding code in order to silence gcc warnings. Just that a complaining gcc breaks the build whereas a complaining Blue Swirl doesn't. But I'll do it here. Kevin
Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
Am 13.02.2013 22:17, schrieb Blue Swirl: On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf kw...@redhat.com wrote: Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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. Can we get rid of this rule for multiline ifs? Having the second/third/... line of the condition and the first line of the then branch with no clear separation severely hurts readability in my opinion. +*bytes = 0; +ret = 0; +goto out; +} + /* We keep all QCOW_OFLAG_COPIED clusters */ keep_clusters = count_contiguous_clusters(nb_clusters, s-cluster_size, Kevin
Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
On Thu, Feb 14, 2013 at 9:40 AM, Kevin Wolf kw...@redhat.com wrote: Am 13.02.2013 22:17, schrieb Blue Swirl: On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf kw...@redhat.com wrote: Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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. Can we get rid of this rule for multiline ifs? Having the second/third/... line of the condition and the first line of the then branch with no clear separation severely hurts readability in my opinion. Perhaps the problem is that the condition is long, it could be rewritten in this style: bool has_host_offset = *host_offset != 0; bool offset_matches = (cluster_offset L2E_OFFSET_MASK) != *host_offset; if (has_host_offset offset_matches) { +*bytes = 0; +ret = 0; +goto out; +} + /* We keep all QCOW_OFLAG_COPIED clusters */ keep_clusters = count_contiguous_clusters(nb_clusters, s-cluster_size, Kevin
[Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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) +{ +*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
Re: [Qemu-devel] [RFC PATCH v2 13/23] qcow2: handle_copied(): Implement non-zero host_offset
On Wed, Feb 13, 2013 at 1:22 PM, Kevin Wolf kw...@redhat.com wrote: Look only for clusters that start at a given physical offset. Signed-off-by: Kevin Wolf kw...@redhat.com --- 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