From 39994f0bf9333497746f1eff13683ade03dcc09f Mon Sep 17 00:00:00 2001
Message-Id: <39994f0bf9333497746f1eff13683ade03dcc09f.1429902956.git.jen@redhat.com>
In-Reply-To: <67968bc615637394c3ef7dfefa360dab90f33d5d.1429902956.git.jen@redhat.com>
References: <67968bc615637394c3ef7dfefa360dab90f33d5d.1429902956.git.jen@redhat.com>
From: Max Reitz <mreitz@redhat.com>
Date: Wed, 18 Mar 2015 19:21:53 -0500
Subject: [CHANGE 10/42] block: Introduce qemu_try_blockalign()
To: rhvirt-patches@redhat.com,
    jen@redhat.com

RH-Author: Max Reitz <mreitz@redhat.com>
Message-id: <1426706542-30384-11-git-send-email-mreitz@redhat.com>
Patchwork-id: 64474
O-Subject: [RHEL-6.7 qemu-kvm PATCH v2 10/39] block: Introduce qemu_try_blockalign()
Bugzilla: 1129892
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>

From: Kevin Wolf <kwolf@redhat.com>

BZ: 1129892

This function returns NULL instead of aborting when an allocation fails.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
(cherry picked from commit 7d2a35cc921ea4832083a7e8598461868bb538ce)
Signed-off-by: Jeff E. Nelson <jen@redhat.com>

Conflicts:
	include/block/block.h
	block_int.h
	include/qemu/osdep.h
	osdep.h
	util/oslib-posix.c
	util/oslib-win32.c
	osdep.c

Different files upstream and downstream; dropped the #ifdef around the
definition of oom_check() (because after this patch there is no case
where it would be unused).

Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Jeff E. Nelson <jen@redhat.com>
---
 block.c     | 13 +++++++++++++
 block_int.h |  1 +
 osdep.c     | 22 ++++++++++++----------
 osdep.h     |  1 +
 4 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/block.c b/block.c
index 6c14a9d..dcc6d26 100644
--- a/block.c
+++ b/block.c
@@ -4360,6 +4360,19 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size)
     return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
 }
 
+void *qemu_try_blockalign(BlockDriverState *bs, size_t size)
+{
+    size_t align = (bs && bs->buffer_alignment) ? bs->buffer_alignment : 512;
+
+    /* Ensure that NULL is never returned on success */
+    assert(align > 0);
+    if (size == 0) {
+        size = align;
+    }
+
+    return qemu_try_memalign(align, size);
+}
+
 /*
  * Check if all memory in this vector is sector aligned.
  */
diff --git a/block_int.h b/block_int.h
index 6b650d5..7587bb8 100644
--- a/block_int.h
+++ b/block_int.h
@@ -309,6 +309,7 @@ struct BlockDriverState {
 int get_tmp_filename(char *filename, int size);
 
 void *qemu_blockalign(BlockDriverState *bs, size_t size);
+void *qemu_try_blockalign(BlockDriverState *bs, size_t size);
 void bdrv_set_io_limits(BlockDriverState *bs,
                         ThrottleConfig *cfg);
 
diff --git a/osdep.c b/osdep.c
index afab41e..6cfdcfe 100644
--- a/osdep.c
+++ b/osdep.c
@@ -57,7 +57,6 @@
 
 static bool fips_enabled = false;
 
-#if !defined(_POSIX_C_SOURCE) || defined(_WIN32) || defined(__sun__)
 static void *oom_check(void *ptr)
 {
     if (ptr == NULL) {
@@ -70,17 +69,16 @@ static void *oom_check(void *ptr)
     }
     return ptr;
 }
-#endif
 
 #if defined(_WIN32)
-void *qemu_memalign(size_t alignment, size_t size)
+void *qemu_try_memalign(size_t alignment, size_t size)
 {
     void *ptr;
 
     if (!size) {
         abort();
     }
-    ptr = oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
+    ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
     trace_qemu_memalign(alignment, size, ptr);
     return ptr;
 }
@@ -108,21 +106,20 @@ void qemu_vfree(void *ptr)
 
 #else
 
-void *qemu_memalign(size_t alignment, size_t size)
+void *qemu_try_memalign(size_t alignment, size_t size)
 {
     void *ptr;
 #if defined(_POSIX_C_SOURCE) && !defined(__sun__)
     int ret;
     ret = posix_memalign(&ptr, alignment, size);
     if (ret != 0) {
-        fprintf(stderr, "Failed to allocate %zu B: %s\n",
-                size, strerror(ret));
-        abort();
+        errno = ret;
+        ptr = NULL;
     }
 #elif defined(CONFIG_BSD)
-    ptr = oom_check(valloc(size));
+    ptr = valloc(size);
 #else
-    ptr = oom_check(memalign(alignment, size));
+    ptr = memalign(alignment, size);
 #endif
     trace_qemu_memalign(alignment, size, ptr);
     return ptr;
@@ -149,6 +146,11 @@ void qemu_vfree(void *ptr)
 
 #endif
 
+void *qemu_memalign(size_t alignment, size_t size)
+{
+    return oom_check(qemu_try_memalign(alignment, size));
+}
+
 int qemu_create_pidfile(const char *filename)
 {
     char buffer[128];
diff --git a/osdep.h b/osdep.h
index 3122134..33fae6c 100644
--- a/osdep.h
+++ b/osdep.h
@@ -99,6 +99,7 @@
 #define MADV_DONTDUMP 16
 #endif
 
+void *qemu_try_memalign(size_t alignment, size_t size);
 void *qemu_memalign(size_t alignment, size_t size);
 void *qemu_vmalloc(size_t size);
 void qemu_vfree(void *ptr);
-- 
2.1.0

