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.
cute-signatures
Timo Teräs 2015-09-03 13:15:18 +03:00
parent 0e87d08d2d
commit 9ffa38222b
1 changed files with 8 additions and 3 deletions

View File

@ -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;