Fix F_PREALLOC based allocation on some OSX versions

pull/230/merge
Nils Maier 2014-05-08 01:04:02 +02:00
parent 1dd7409c4e
commit 5c07f0109e
1 changed files with 12 additions and 4 deletions

View File

@ -476,19 +476,27 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse)
truncate(offset+length);
# elif defined(__APPLE__) && defined(__MACH__)
auto toalloc = offset + length - size();
if (toalloc > 0) {
fstore_t fstore = {F_ALLOCATECONTIG | F_ALLOCATEALL, F_PEOFPOSMODE, 0, toalloc};
while (toalloc > 0) {
fstore_t fstore = {
F_ALLOCATECONTIG | F_ALLOCATEALL,
F_PEOFPOSMODE,
0,
// Allocate in 1GB chunks or else some OSX versions may choke.
std::min(toalloc, (int64_t)1<<30),
0
};
if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) {
// Retry non-contig.
fstore.fst_flags = F_ALLOCATEALL;
if (fcntl(fd_, F_PREALLOCATE, &fstore) == -1) {
int err = errno;
throw DL_ABORT_EX3(err,
fmt("fcntl(F_PREALLOCATE failed. cause: %s",
util::safeStrerror(err).c_str()),
fmt("fcntl(F_PREALLOCATE) of %" PRId64 " failed. cause: %s",
fstore.fst_length, util::safeStrerror(err).c_str()),
error_code::FILE_IO_ERROR);
}
}
toalloc -= fstore.fst_bytesalloc;
}
// This forces the allocation on disk.
ftruncate(fd_, offset + length);