aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2015-09-03 13:15:18 +0300
committerTimo Teräs <timo.teras@iki.fi>2015-09-03 13:15:18 +0300
commit9ffa38222b9ee5e105f72f705c4449d548f3eb7b (patch)
tree93848e3b39fa84bc3cf1a2a18d7cc534f42e9cb4
parent0e87d08d2d603a09169be9211602b10a158a2928 (diff)
downloadaports-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.tar.bz2
aports-9ffa38222b9ee5e105f72f705c4449d548f3eb7b.tar.xz
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.
-rw-r--r--src/io.c11
1 files 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;