#include "os/os.h"
#include "hash.h"
#include "lib/axmap.h"
+#include "lib/memalign.h"
#ifdef CONFIG_LINUX_FALLOCATE
#include <linux/falloc.h>
{
int new_layout = 0, unlink_file = 0, flags;
unsigned long long left;
- unsigned int bs;
+ unsigned int bs, alloc_size = 0;
char *b = NULL;
if (read_only) {
if (err == ENOENT && !td->o.allow_create)
log_err("fio: file creation disallowed by "
"allow_file_create=0\n");
- else
+ else {
+ if (err == EINVAL && (flags & OS_O_DIRECT))
+ log_err("fio: looks like your filesystem "
+ "does not support "
+ "direct=1/buffered=0\n");
+
td_verror(td, err, "open");
+ }
return 1;
}
}
}
+ if (td->o.odirect && !OS_O_DIRECT && fio_set_directio(td, f))
+ goto err;
+
left = f->real_file_size;
bs = td->o.max_bs[DDIR_WRITE];
if (bs > left)
bs = left;
- b = malloc(bs);
+ alloc_size = bs;
+ b = fio_memalign(page_size, alloc_size);
if (!b) {
- td_verror(td, errno, "malloc");
+ td_verror(td, errno, "fio_memalign");
goto err;
}
f->io_size = f->real_file_size;
}
- free(b);
+ fio_memfree(b, alloc_size);
done:
return 0;
err:
close(f->fd);
f->fd = -1;
if (b)
- free(b);
+ fio_memfree(b, alloc_size);
return 1;
}
{
free_already_allocated();
}
+
+/*
+ * This function is for platforms which support direct I/O but not O_DIRECT.
+ */
+int fio_set_directio(struct thread_data *td, struct fio_file *f)
+{
+#ifdef FIO_OS_DIRECTIO
+ int ret = fio_set_odirect(f);
+
+ if (ret) {
+ td_verror(td, ret, "fio_set_directio");
+#if defined(__sun__)
+ if (ret == ENOTTY) { /* ENOTTY suggests RAW device or ZFS */
+ log_err("fio: doing directIO to RAW devices or ZFS not supported\n");
+ } else {
+ log_err("fio: the file system does not seem to support direct IO\n");
+ }
+#else
+ log_err("fio: the file system does not seem to support direct IO\n");
+#endif
+ return -1;
+ }
+
+ return 0;
+#else
+ return -1;
+#endif
+}