* [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression
@ 2015-06-23 21:34 Jindřich Makovička
2015-06-23 21:34 ` [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount Jindřich Makovička
2015-06-25 14:52 ` [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Stefan Hajnoczi
0 siblings, 2 replies; 7+ messages in thread
From: Jindřich Makovička @ 2015-06-23 21:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Jindřich Makovička
Hi,
the following patch adds missing EAGAIN handling in qcow2 code.
When the conditions for throwing EAGAIN from the refcount allocator
are met, qcow-img image recompression fails with "error while writing
sector".
Jindřich Makovička (1):
qcow2: Handle EAGAIN returned from update_refcount
block/qcow2-refcount.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
--
2.1.4
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount
2015-06-23 21:34 [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Jindřich Makovička
@ 2015-06-23 21:34 ` Jindřich Makovička
2015-06-24 5:05 ` Jindřich Makovička
2015-06-25 14:52 ` [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Stefan Hajnoczi
1 sibling, 1 reply; 7+ messages in thread
From: Jindřich Makovička @ 2015-06-23 21:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Jindřich Makovička
Fixes a crash during image compression
Signed-off-by: Jindřich Makovička <makovick@gmail.com>
---
block/qcow2-refcount.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 0632fc3..f8d18e7 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -940,19 +940,22 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
}
free_in_cluster = s->cluster_size - offset_into_cluster(s, offset);
- if (!offset || free_in_cluster < size) {
- int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
- if (new_cluster < 0) {
- return new_cluster;
- }
+ do {
+ if (!offset || free_in_cluster < size) {
+ int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
+ if (new_cluster < 0) {
+ fprintf(stderr, "error getting new cluster\n");
+ return new_cluster;
+ }
- if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
- offset = new_cluster;
+ if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
+ offset = new_cluster;
+ }
}
- }
- assert(offset);
- ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
+ assert(offset);
+ ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
+ } while (ret == -EAGAIN);
if (ret < 0) {
return ret;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount
2015-06-23 21:34 ` [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount Jindřich Makovička
@ 2015-06-24 5:05 ` Jindřich Makovička
2015-06-24 14:15 ` Cole Robinson
2015-06-24 15:26 ` Max Reitz
0 siblings, 2 replies; 7+ messages in thread
From: Jindřich Makovička @ 2015-06-24 5:05 UTC (permalink / raw)
To: qemu-devel; +Cc: Jindřich Makovička
Fixes a crash during image compression
Signed-off-by: Jindřich Makovička <makovick@gmail.com>
---
block/qcow2-refcount.c | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 0632fc3..b0ee42d 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -940,19 +940,21 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
}
free_in_cluster = s->cluster_size - offset_into_cluster(s, offset);
- if (!offset || free_in_cluster < size) {
- int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
- if (new_cluster < 0) {
- return new_cluster;
- }
+ do {
+ if (!offset || free_in_cluster < size) {
+ int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
+ if (new_cluster < 0) {
+ return new_cluster;
+ }
- if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
- offset = new_cluster;
+ if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
+ offset = new_cluster;
+ }
}
- }
- assert(offset);
- ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
+ assert(offset);
+ ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
+ } while (ret == -EAGAIN);
if (ret < 0) {
return ret;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount
2015-06-24 5:05 ` Jindřich Makovička
@ 2015-06-24 14:15 ` Cole Robinson
2015-06-24 14:22 ` Richard W.M. Jones
2015-06-24 15:26 ` Max Reitz
1 sibling, 1 reply; 7+ messages in thread
From: Cole Robinson @ 2015-06-24 14:15 UTC (permalink / raw)
To: Jindřich Makovička, qemu-devel; +Cc: Richard W.M. Jones
On 06/24/2015 01:05 AM, Jindřich Makovička wrote:
> Fixes a crash during image compression
>
> Signed-off-by: Jindřich Makovička <makovick@gmail.com>
> ---
> block/qcow2-refcount.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
Rich Jones already confirmed that this patch fixes a bug he can reliably
reproduce:
https://bugzilla.redhat.com/show_bug.cgi?id=1214855
- Cole
> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
> index 0632fc3..b0ee42d 100644
> --- a/block/qcow2-refcount.c
> +++ b/block/qcow2-refcount.c
> @@ -940,19 +940,21 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
> }
>
> free_in_cluster = s->cluster_size - offset_into_cluster(s, offset);
> - if (!offset || free_in_cluster < size) {
> - int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
> - if (new_cluster < 0) {
> - return new_cluster;
> - }
> + do {
> + if (!offset || free_in_cluster < size) {
> + int64_t new_cluster = alloc_clusters_noref(bs, s->cluster_size);
> + if (new_cluster < 0) {
> + return new_cluster;
> + }
>
> - if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
> - offset = new_cluster;
> + if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
> + offset = new_cluster;
> + }
> }
> - }
>
> - assert(offset);
> - ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
> + assert(offset);
> + ret = update_refcount(bs, offset, size, 1, false, QCOW2_DISCARD_NEVER);
> + } while (ret == -EAGAIN);
> if (ret < 0) {
> return ret;
> }
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount
2015-06-24 14:15 ` Cole Robinson
@ 2015-06-24 14:22 ` Richard W.M. Jones
0 siblings, 0 replies; 7+ messages in thread
From: Richard W.M. Jones @ 2015-06-24 14:22 UTC (permalink / raw)
To: Cole Robinson; +Cc: Jindřich Makovička, qemu-devel
On Wed, Jun 24, 2015 at 10:15:21AM -0400, Cole Robinson wrote:
> On 06/24/2015 01:05 AM, Jindřich Makovička wrote:
> > Fixes a crash during image compression
> >
> > Signed-off-by: Jindřich Makovička <makovick@gmail.com>
> > ---
> > block/qcow2-refcount.c | 22 ++++++++++++----------
> > 1 file changed, 12 insertions(+), 10 deletions(-)
> >
>
> Rich Jones already confirmed that this patch fixes a bug he can reliably
> reproduce:
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1214855
Confirmed. You can add
Tested-by: Richard W.M. Jones <rjones@redhat.com>
to this patch.
Also note that if you view the patch without whitespace changes
(eg. git diff -b) then it's actually quite simple.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount
2015-06-24 5:05 ` Jindřich Makovička
2015-06-24 14:15 ` Cole Robinson
@ 2015-06-24 15:26 ` Max Reitz
1 sibling, 0 replies; 7+ messages in thread
From: Max Reitz @ 2015-06-24 15:26 UTC (permalink / raw)
To: Jindřich Makovička, qemu-devel, qemu-block
Cc: Kevin Wolf, Stefan Hajnoczi
On 24.06.2015 07:05, Jindřich Makovička wrote:
> Fixes a crash during image compression
>
> Signed-off-by: Jindřich Makovička <makovick@gmail.com>
> ---
> block/qcow2-refcount.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
Reviewed-by: Max Reitz <mreitz@redhat.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression
2015-06-23 21:34 [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Jindřich Makovička
2015-06-23 21:34 ` [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount Jindřich Makovička
@ 2015-06-25 14:52 ` Stefan Hajnoczi
1 sibling, 0 replies; 7+ messages in thread
From: Stefan Hajnoczi @ 2015-06-25 14:52 UTC (permalink / raw)
To: Jindřich Makovička; +Cc: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 635 bytes --]
On Tue, Jun 23, 2015 at 11:34:48PM +0200, Jindřich Makovička wrote:
> Hi,
>
> the following patch adds missing EAGAIN handling in qcow2 code.
>
> When the conditions for throwing EAGAIN from the refcount allocator
> are met, qcow-img image recompression fails with "error while writing
> sector".
>
> Jindřich Makovička (1):
> qcow2: Handle EAGAIN returned from update_refcount
>
> block/qcow2-refcount.c | 23 +++++++++++++----------
> 1 file changed, 13 insertions(+), 10 deletions(-)
>
> --
> 2.1.4
>
>
Thanks, applied to my block tree:
https://github.com/stefanha/qemu/commits/block
Stefan
[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-06-25 14:52 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-06-23 21:34 [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Jindřich Makovička
2015-06-23 21:34 ` [Qemu-devel] [PATCH] qcow2: Handle EAGAIN returned from update_refcount Jindřich Makovička
2015-06-24 5:05 ` Jindřich Makovička
2015-06-24 14:15 ` Cole Robinson
2015-06-24 14:22 ` Richard W.M. Jones
2015-06-24 15:26 ` Max Reitz
2015-06-25 14:52 ` [Qemu-devel] [PATCH] Fix occassional crashes during qcow2 recompression Stefan Hajnoczi
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.