diff --git a/meson.build b/meson.build index c99aaed797fcd..a09ad156dd27b 100644 --- a/meson.build +++ b/meson.build @@ -1277,6 +1277,7 @@ functions_to_detect = { 'strtok_r': '', 'getrandom': '', 'qsort_s': '', + 'posix_fallocate': '', } foreach f, prefix: functions_to_detect diff --git a/src/util/disk_cache_os.c b/src/util/disk_cache_os.c index 27a1392605976..e3596f2b4b02b 100644 --- a/src/util/disk_cache_os.c +++ b/src/util/disk_cache_os.c @@ -1019,8 +1019,20 @@ disk_cache_mmap_cache_index(void *mem_ctx, struct disk_cache *cache, /* Force the index file to be the expected size. */ size_t size = sizeof(*cache->size) + CACHE_INDEX_MAX_KEYS * CACHE_KEY_SIZE; if (sb.st_size != size) { +#if HAVE_POSIX_FALLOCATE + /* posix_fallocate() ensures disk space is allocated otherwise it + * fails if there is not enough space on the disk. + */ + if (posix_fallocate(fd, 0, size) != 0) + goto path_fail; +#else + /* ftruncate() allocates disk space lazily. If the disk is full + * and it is unable to allocate disk space when accessed via + * mmap, it will crash with a SIGBUS. + */ if (ftruncate(fd, size) == -1) goto path_fail; +#endif } /* We map this shared so that other processes see updates that we