+static int native_fallocate(struct thread_data *td, struct fio_file *f)
+{
+ bool success;
+
+ success = fio_fallocate(f, 0, f->real_file_size);
+ dprint(FD_FILE, "native fallocate of file %s size %llu was "
+ "%ssuccessful\n", f->file_name,
+ (unsigned long long) f->real_file_size,
+ !success ? "un": "");
+
+ if (success)
+ return false;
+
+ if (errno == ENOSYS)
+ dprint(FD_FILE, "native fallocate is not implemented\n");
+
+ return true;
+}
+
+static void fallocate_file(struct thread_data *td, struct fio_file *f)
+{
+ if (td->o.fill_device)
+ return;
+
+ switch (td->o.fallocate_mode) {
+ case FIO_FALLOCATE_NATIVE:
+ native_fallocate(td, f);
+ break;
+ case FIO_FALLOCATE_NONE:
+ break;
+#ifdef CONFIG_POSIX_FALLOCATE
+ case FIO_FALLOCATE_POSIX: {
+ int r;
+
+ dprint(FD_FILE, "posix_fallocate file %s size %llu\n",
+ f->file_name,
+ (unsigned long long) f->real_file_size);
+
+ r = posix_fallocate(f->fd, 0, f->real_file_size);
+ if (r > 0)
+ log_err("fio: posix_fallocate fails: %s\n", strerror(r));
+ break;
+ }
+#endif /* CONFIG_POSIX_FALLOCATE */
+#ifdef CONFIG_LINUX_FALLOCATE
+ case FIO_FALLOCATE_KEEP_SIZE: {
+ int r;
+
+ dprint(FD_FILE, "fallocate(FALLOC_FL_KEEP_SIZE) "
+ "file %s size %llu\n", f->file_name,
+ (unsigned long long) f->real_file_size);
+
+ r = fallocate(f->fd, FALLOC_FL_KEEP_SIZE, 0, f->real_file_size);
+ if (r != 0)
+ td_verror(td, errno, "fallocate");
+
+ break;
+ }
+#endif /* CONFIG_LINUX_FALLOCATE */
+ case FIO_FALLOCATE_TRUNCATE: {
+ int r;
+
+ dprint(FD_FILE, "ftruncate file %s size %llu\n",
+ f->file_name,
+ (unsigned long long) f->real_file_size);
+ r = ftruncate(f->fd, f->real_file_size);
+ if (r != 0)
+ td_verror(td, errno, "ftruncate");
+
+ break;
+ }
+ default:
+ log_err("fio: unknown fallocate mode: %d\n", td->o.fallocate_mode);
+ assert(0);
+ }
+}
+