From 9ffa38222b9ee5e105f72f705c4449d548f3eb7b Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Thu, 3 Sep 2015 13:15:18 +0300 Subject: io: use posix_fallocate to allocate disk space ftruncate does not allocate it, and subsequent access to mmaped file will result in SIGBUS. this fixes to properly report disk full errors. --- src/io.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/io.c') diff --git a/src/io.c b/src/io.c index a62ef36..a321c0c 100644 --- a/src/io.c +++ b/src/io.c @@ -144,9 +144,14 @@ size_t apk_istream_splice(void *stream, int fd, size_t size, bufsz = size; if (size > 128 * 1024) { - if (size != APK_SPLICE_ALL && ftruncate(fd, size) == 0) - mmapbase = mmap(NULL, size, PROT_READ | PROT_WRITE, - MAP_SHARED, fd, 0); + if (size != APK_SPLICE_ALL) { + r = posix_fallocate(fd, 0, size); + if (r == 0) + mmapbase = mmap(NULL, size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + else if (r != ENOSYS) + return -r; + } if (bufsz > 2*1024*1024) bufsz = 2*1024*1024; buf = mmapbase; -- cgit v1.2.3-60-g2f50