Merge #15650: Handle the result of posix_fallocate system call

5d35ae3326 Handle the result of posix_fallocate system call (Luca Venturini)

Pull request description:

  The system call `posix_fallocate` is not supported on some filesystems.

  - catches the result of posix_allocate and fall back to the default behaviour if the return value is different from 0 (success)

  Fixes #15624

ACKs for commit 5d35ae:
  MarcoFalke:
    utACK 5d35ae3326
  sipa:
    utACK 5d35ae3326, though the Yoda condition is an uncommon style in this project.
  hebasto:
    utACK 5d35ae3326
  practicalswift:
    utACK 5d35ae3326

Tree-SHA512: 7ab3b35fb633926f28a58b2b07ffde8e31bb997c80a716b1b45ee716fe9ff4ddcef0a05810bd4423530e220cfc62f8925517d27a8b92b05a524272063e43f746
This commit is contained in:
MarcoFalke 2019-05-02 08:43:54 -04:00
commit c4560a7dfe
No known key found for this signature in database
GPG key ID: D2EA4850E7528B25

View file

@ -1085,11 +1085,12 @@ void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length) {
fcntl(fileno(file), F_PREALLOCATE, &fst); fcntl(fileno(file), F_PREALLOCATE, &fst);
} }
ftruncate(fileno(file), fst.fst_length); ftruncate(fileno(file), fst.fst_length);
#elif defined(__linux__) #else
#if defined(__linux__)
// Version using posix_fallocate // Version using posix_fallocate
off_t nEndPos = (off_t)offset + length; off_t nEndPos = (off_t)offset + length;
posix_fallocate(fileno(file), 0, nEndPos); if (0 == posix_fallocate(fileno(file), 0, nEndPos)) return;
#else #endif
// Fallback version // Fallback version
// TODO: just write one byte per block // TODO: just write one byte per block
static const char buf[65536] = {}; static const char buf[65536] = {};