From 5463d9596903b370e7d078eeacb0e3f3c71c526f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Mon, 25 Sep 2017 16:29:34 +0200 Subject: [PATCH] use virFileAllocate in virStorageFileResize Introduce a new function virFileAllocate that will call the non-destructive variants of safezero, essentially reverting my commit 1390c268 safezero: fall back to writing zeroes even when resizing back to the state as of commit 18f0316 virstoragefile: Have virStorageFileResize use safezero This means that _ALLOCATE flag will no longer work on platforms without the allocate syscalls, but it will not overwrite data either. --- src/util/virfile.c | 11 +++++++++++ src/util/virfile.h | 2 ++ src/util/virstoragefile.c | 15 ++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/util/virfile.c b/src/util/virfile.c index a03a23fab0..7ca60052d2 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -1216,6 +1216,17 @@ int safezero(int fd, off_t offset, off_t len) return safezero_slow(fd, offset, len); } +int virFileAllocate(int fd, off_t offset, off_t len) +{ + int ret; + + ret = safezero_posix_fallocate(fd, offset, len); + if (ret != -2) + return ret; + + return safezero_sys_fallocate(fd, offset, len); +} + #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R /* search /proc/mounts for mount point of *type; return pointer to * malloc'ed string of the path if found, otherwise return NULL diff --git a/src/util/virfile.h b/src/util/virfile.h index 57ceb80721..21fb41b707 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -44,6 +44,8 @@ ssize_t safewrite(int fd, const void *buf, size_t count) ATTRIBUTE_RETURN_CHECK; int safezero(int fd, off_t offset, off_t len) ATTRIBUTE_RETURN_CHECK; +int virFileAllocate(int fd, off_t offset, off_t len) + ATTRIBUTE_RETURN_CHECK; /* Don't call these directly - use the macros below */ int virFileClose(int *fdptr, virFileCloseFlags flags) diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 484a5c8067..b3da0a4528 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -1320,7 +1320,7 @@ virStorageFileResize(const char *path, { int fd = -1; int ret = -1; - int rc ATTRIBUTE_UNUSED; + int rc; off_t offset ATTRIBUTE_UNUSED; off_t len ATTRIBUTE_UNUSED; @@ -1333,10 +1333,15 @@ virStorageFileResize(const char *path, } if (pre_allocate) { - if (safezero(fd, offset, len) != 0) { - virReportSystemError(errno, - _("Failed to pre-allocate space for " - "file '%s'"), path); + if ((rc = virFileAllocate(fd, offset, len)) != 0) { + if (rc == -2) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("preallocate is not supported on this platform")); + } else { + virReportSystemError(errno, + _("Failed to pre-allocate space for " + "file '%s'"), path); + } goto cleanup; } } else { -- GitLab