Refactor qemu_memfd_alloc() to simply return the opened fd. mmap() can be done later by the caller.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- include/qemu/memfd.h | 3 +++ util/memfd.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h index 975b6bdb77..1642af9459 100644 --- a/include/qemu/memfd.h +++ b/include/qemu/memfd.h @@ -44,4 +44,7 @@ void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, void qemu_memfd_free(void *ptr, size_t size, int fd); bool qemu_memfd_check(unsigned int flags); +int qemu_memfd_open(const char *name, size_t size, + unsigned int seals, Error **errp); + #endif /* QEMU_MEMFD_H */ diff --git a/util/memfd.c b/util/memfd.c index 4a3c07e0be..523b943b62 100644 --- a/util/memfd.c +++ b/util/memfd.c @@ -104,10 +104,9 @@ err: * memfd with sealing, but may fallback on other methods without * sealing. */ -void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, - int *fd, Error **errp) +int qemu_memfd_open(const char *name, size_t size, unsigned int seals, + Error **errp) { - void *ptr; int mfd = qemu_memfd_create(name, size, false, 0, seals, NULL); /* some systems have memfd without sealing */ @@ -124,26 +123,38 @@ void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, unlink(fname); g_free(fname); - if (mfd == -1 || - ftruncate(mfd, size) == -1) { - goto err; + if (mfd != -1 && ftruncate(mfd, size) == -1) { + close(mfd); + mfd = -1; } } + if (mfd == -1) { + error_setg_errno(errp, errno, "qemu_memfd_open() failed"); + } + + return mfd; +} + +void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals, + int *fd, Error **errp) +{ + int mfd = qemu_memfd_open(name, size, seals, errp); + void *ptr; + + if (mfd == -1) { + return NULL; + } + ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, mfd, 0); if (ptr == MAP_FAILED) { - goto err; + error_setg_errno(errp, errno, "failed to allocate shared memory"); + close(mfd); + return NULL; } *fd = mfd; return ptr; - -err: - error_setg_errno(errp, errno, "failed to allocate shared memory"); - if (mfd >= 0) { - close(mfd); - } - return NULL; } void qemu_memfd_free(void *ptr, size_t size, int fd) -- 2.24.0