MacOS: Allocate once (apfs compat)

pull/1057/head
Nils Maier 2017-11-01 12:38:08 +01:00
parent d508e41198
commit 992944257c
1 changed files with 12 additions and 16 deletions

View File

@ -525,12 +525,10 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse)
fileStrerror(errNum).c_str())); fileStrerror(errNum).c_str()));
} }
#elif defined(__APPLE__) && defined(__MACH__) #elif defined(__APPLE__) && defined(__MACH__)
auto toalloc = offset + length - size(); const auto toalloc = offset + length - size();
while (toalloc > 0) {
fstore_t fstore = { fstore_t fstore = {
F_ALLOCATECONTIG | F_ALLOCATEALL, F_PEOFPOSMODE, 0, F_ALLOCATECONTIG | F_ALLOCATEALL, F_PEOFPOSMODE,
// Allocate in 1GB chunks or else some OSX versions may choke. 0, toalloc, 0};
std::min(toalloc, (int64_t)1 << 30), 0};
if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) { if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) {
// Retry non-contig. // Retry non-contig.
fstore.fst_flags = F_ALLOCATEALL; fstore.fst_flags = F_ALLOCATEALL;
@ -542,8 +540,6 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse)
error_code::FILE_IO_ERROR); error_code::FILE_IO_ERROR);
} }
} }
toalloc -= fstore.fst_bytesalloc;
}
// This forces the allocation on disk. // This forces the allocation on disk.
ftruncate(fd_, offset + length); ftruncate(fd_, offset + length);
#elif HAVE_FALLOCATE #elif HAVE_FALLOCATE