1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-29 15:21:50 +03:00

virfile: Refactor safezero

Currently build conditionals decide which of two safezero() functions
should be built - either the posix_fallocate() or mmap() with a fallback
to a slower safewrite() algorithm in order to preallocate space in a raw file.

This patch will refactor safezero to utilize static functions for either
posix_fallocate or mmap/safewrite. The build conditional still exist, but
are only for shorter sections of code.

The posix_fallocate path will make use of the ret/errno setting to contain
the logic for safezero to decide whether it needs to fallback to other
algorithms. A return of -1 with errno not changed will indicate the conditional
is not present; otherwise, a return of -1 with errno change indicates the
call was made and it failed (no functional difference to current algorithm).

The mmap/safewrite option changes only slightly to handle the ftruncate
failure for mmap. That is, previously if the ftruncate failed, there was
no fallback to the slow safewrite option.

Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
John Ferlan 2014-12-05 16:18:29 -05:00
parent feb1a4d792
commit 214c687b97

View File

@ -1034,26 +1034,24 @@ safewrite(int fd, const void *buf, size_t count)
return nwritten;
}
#ifdef HAVE_POSIX_FALLOCATE
int
safezero(int fd, off_t offset, off_t len)
static int
safezero_posix_fallocate(int fd, off_t offset, off_t len)
{
#ifdef HAVE_POSIX_FALLOCATE
int ret = posix_fallocate(fd, offset, len);
if (ret == 0)
return 0;
errno = ret;
#endif
return -1;
}
#else
int
safezero(int fd, off_t offset, off_t len)
static int
safezero_mmap(int fd, off_t offset, off_t len)
{
#ifdef HAVE_MMAP
int r;
char *buf;
unsigned long long remain, bytes;
# ifdef HAVE_MMAP
static long pagemask;
off_t map_skip;
@ -1080,7 +1078,16 @@ safezero(int fd, off_t offset, off_t len)
/* fall back to writing zeroes using safewrite if mmap fails (for
* example because of virtual memory limits) */
# endif /* HAVE_MMAP */
#endif /* HAVE_MMAP */
return -1;
}
static int
safezero_slow(int fd, off_t offset, off_t len)
{
int r;
char *buf;
unsigned long long remain, bytes;
if (lseek(fd, offset, SEEK_SET) < 0)
return -1;
@ -1111,8 +1118,26 @@ safezero(int fd, off_t offset, off_t len)
VIR_FREE(buf);
return 0;
}
#endif /* HAVE_POSIX_FALLOCATE */
int safezero(int fd, off_t offset, off_t len)
{
int ret;
/* posix_fallocate returns 0 on success or error number on failure,
* but errno is not set so use that to our advantage since we set
* errno to the returned value if we make the call. If we don't make
* the call because it doesn't exist, then errno won't change and
* we can try other methods.
*/
errno = 0;
ret = safezero_posix_fallocate(fd, offset, len);
if (ret == 0 || errno != 0)
return ret;
if (safezero_mmap(fd, offset, len) == 0)
return 0;
return safezero_slow(fd, offset, len);
}
#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
/* search /proc/mounts for mount point of *type; return pointer to