rbd: 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 rbd block driver.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Kevin Wolf 2014-05-21 18:11:48 +02:00
parent 4b6af3d58a
commit 0f7a02379b
1 changed files with 5 additions and 2 deletions

View File

@ -617,7 +617,7 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
RBDAIOCmd cmd) RBDAIOCmd cmd)
{ {
RBDAIOCB *acb; RBDAIOCB *acb;
RADOSCB *rcb; RADOSCB *rcb = NULL;
rbd_completion_t c; rbd_completion_t c;
int64_t off, size; int64_t off, size;
char *buf; char *buf;
@ -631,7 +631,10 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) { if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL; acb->bounce = NULL;
} else { } else {
acb->bounce = qemu_blockalign(bs, qiov->size); acb->bounce = qemu_try_blockalign(bs, qiov->size);
if (acb->bounce == NULL) {
goto failed;
}
} }
acb->ret = 0; acb->ret = 0;
acb->error = 0; acb->error = 0;