summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2014-05-21 18:16:21 +0200
committerKevin Wolf <kwolf@redhat.com>2014-08-15 15:07:16 +0200
commit7504edf477d2bac9cbf53225811ec595abf045e4 (patch)
tree1e500356ea9eda6905c0c7712f6b6f2f3410252c
parent5fb09cd5867aabf26d5b85b0913dccd496b71421 (diff)
downloadfocaccia-qemu-7504edf477d2bac9cbf53225811ec595abf045e4.tar.gz
focaccia-qemu-7504edf477d2bac9cbf53225811ec595abf045e4.zip
mirror: Handle failure for potentially large allocations
Some code in the block layer makes potentially huge allocations. Failure
is not completely unexpected there, so avoid aborting qemu and handle
out-of-memory situations gracefully.

This patch addresses the allocations in the mirror block job.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
-rw-r--r--block/mirror.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/block/mirror.c b/block/mirror.c
index c7a655fc58..5e7a166b39 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -367,7 +367,12 @@ static void coroutine_fn mirror_run(void *opaque)
     }
 
     end = s->common.len >> BDRV_SECTOR_BITS;
-    s->buf = qemu_blockalign(bs, s->buf_size);
+    s->buf = qemu_try_blockalign(bs, s->buf_size);
+    if (s->buf == NULL) {
+        ret = -ENOMEM;
+        goto immediate_exit;
+    }
+
     sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
     mirror_free_init(s);