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.
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
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)
{
int fd = -1;
int ret = -1;
- int rc ATTRIBUTE_UNUSED;
+ int rc;
off_t offset ATTRIBUTE_UNUSED;
off_t len ATTRIBUTE_UNUSED;
}
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 {