VOID_TEMP_FAILURE_RETRY(::close(fd));
return r;
}
+#ifdef HAVE_POSIX_FALLOCATE
+ r = ::posix_fallocate(fd, 0, size);
+ if (r < 0) {
+ r = -errno;
+ derr << __func__ << " failed to prefallocate " << name << " file to "
+ << size << ": " << cpp_strerror(r) << dendl;
+ VOID_TEMP_FAILURE_RETRY(::close(fd));
+ return r;
+ }
+#else
+ char data[1024*128];
+ for (uint64_t off = 0; off < size; off += sizeof(data)) {
+ if (off + sizeof(data) > size)
+ r = ::write(fd, data, size - off);
+ else
+ r = ::write(fd, data, sizeof(data));
+ if (r < 0) {
+ r = -errno;
+ derr << __func__ << " failed to prefallocate w/ write " << name << " file to "
+ << size << ": " << cpp_strerror(r) << dendl;
+ VOID_TEMP_FAILURE_RETRY(::close(fd));
+ return r;
+ }
+ }
+#endif
dout(1) << __func__ << " resized " << name << " file to "
<< pretty_si_t(size) << "B" << dendl;
}