From 9ffa38222b9ee5e105f72f705c4449d548f3eb7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= 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(-) diff --git a/src/io.c b/src/io.c index a62ef36b46..a321c0c8f0 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