- int flags = 0;
- int ret = 0;
- struct gf_data *g = td->io_ops->data;
- struct stat sb = {0, };
-
- if (td_write(td)) {
- if (!read_only)
- flags = O_RDWR;
- } else if (td_read(td)) {
- if (!read_only)
- flags = O_RDWR;
- else
- flags = O_RDONLY;
- }
- dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name,
- flags == O_RDONLY? "ro":"rw", td_read(td)? "read":"write");
- g->fd = glfs_creat(g->fs, f->file_name, flags, 0644);
- if (!g->fd){
- log_err("glfs_creat failed.\n");
- ret = errno;
- }
- /* file for read doesn't exist or shorter than required, create/extend it */
- if (td_read(td)){
- if (glfs_lstat (g->fs, f->file_name, &sb) || sb.st_size < f->real_file_size){
- dprint(FD_FILE, "fio extend file %s from %ld to %ld\n", f->file_name, sb.st_size, f->real_file_size);
- ret = glfs_ftruncate (g->fd, f->real_file_size);
- if (ret){
- log_err("failed fio extend file %s to %ld\n", f->file_name, f->real_file_size);
- }else{
- unsigned long long left;
- unsigned int bs;
- char *b;
- int r;
-
- /* fill the file, copied from extend_file */
- b = malloc(td->o.max_bs[DDIR_WRITE]);
-
- left = f->real_file_size;
- while (left && !td->terminate) {
- bs = td->o.max_bs[DDIR_WRITE];
- if (bs > left)
- bs = left;
-
- fill_io_buffer(td, b, bs, bs);
-
- r = glfs_write(g->fd, b, bs, 0);
- dprint(FD_IO, "fio write %d of %ld file %s\n", r, f->real_file_size, f->file_name);
-
- if (r > 0) {
- left -= r;
- continue;
- } else {
- if (r < 0) {
- int __e = errno;
-
- if (__e == ENOSPC) {
- if (td->o.fill_device)
- break;
- log_info("fio: ENOSPC on laying out "
- "file, stopping\n");
- break;
- }
- td_verror(td, errno, "write");
- } else
- td_verror(td, EIO, "write");
-
- break;
- }
- }
-
- if (b) free(b);
- glfs_lseek(g->fd, 0, SEEK_SET);
-
- if (td->terminate) {
- dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
- unlink(f->file_name);
- } else if (td->o.create_fsync) {
- if (glfs_fsync(g->fd) < 0) {
- dprint(FD_FILE, "failed to sync, close %s\n", f->file_name);
- td_verror(td, errno, "fsync");
- glfs_close(g->fd);
- g->fd = NULL;
- return 1;
- }
- }
- }
- }
- }
+ int flags = 0;
+ int ret = 0;
+ struct gf_data *g = td->io_ops->data;
+ struct stat sb = { 0, };
+
+ if (td_write(td)) {
+ if (!read_only)
+ flags = O_RDWR;
+ } else if (td_read(td)) {
+ if (!read_only)
+ flags = O_RDWR;
+ else
+ flags = O_RDONLY;
+ }
+
+ if (td->o.odirect)
+ flags |= OS_O_DIRECT;
+ if (td->o.sync_io)
+ flags |= O_SYNC;
+
+ dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name,
+ flags & O_RDONLY ? "ro" : "rw", td_read(td) ? "read" : "write");
+ g->fd = glfs_creat(g->fs, f->file_name, flags, 0644);
+ if (!g->fd) {
+ ret = errno;
+ log_err("glfs_creat failed.\n");
+ return ret;
+ }
+ /* file for read doesn't exist or shorter than required, create/extend it */
+ if (td_read(td)) {
+ if (glfs_lstat(g->fs, f->file_name, &sb)
+ || sb.st_size < f->real_file_size) {
+ dprint(FD_FILE, "fio extend file %s from %ld to %ld\n",
+ f->file_name, sb.st_size, f->real_file_size);
+ ret = glfs_ftruncate(g->fd, f->real_file_size);
+ if (ret) {
+ log_err("failed fio extend file %s to %ld\n",
+ f->file_name, f->real_file_size);
+ } else {
+ unsigned long long left;
+ unsigned int bs;
+ char *b;
+ int r;
+
+ /* fill the file, copied from extend_file */
+ b = malloc(td->o.max_bs[DDIR_WRITE]);
+
+ left = f->real_file_size;
+ while (left && !td->terminate) {
+ bs = td->o.max_bs[DDIR_WRITE];
+ if (bs > left)
+ bs = left;
+
+ fill_io_buffer(td, b, bs, bs);
+
+ r = glfs_write(g->fd, b, bs, 0);
+ dprint(FD_IO,
+ "fio write %d of %ld file %s\n",
+ r, f->real_file_size,
+ f->file_name);
+
+ if (r > 0) {
+ left -= r;
+ continue;
+ } else {
+ if (r < 0) {
+ int __e = errno;
+
+ if (__e == ENOSPC) {
+ if (td->o.
+ fill_device)
+ break;
+ log_info
+ ("fio: ENOSPC on laying out "
+ "file, stopping\n");
+ break;
+ }
+ td_verror(td, errno,
+ "write");
+ } else
+ td_verror(td, EIO,
+ "write");
+
+ break;
+ }
+ }
+
+ if (b)
+ free(b);
+ glfs_lseek(g->fd, 0, SEEK_SET);
+
+ if (td->terminate && td->o.unlink) {
+ dprint(FD_FILE, "terminate unlink %s\n",
+ f->file_name);
+ glfs_unlink(g->fs, f->file_name);
+ } else if (td->o.create_fsync) {
+ if (glfs_fsync(g->fd) < 0) {
+ dprint(FD_FILE,
+ "failed to sync, close %s\n",
+ f->file_name);
+ td_verror(td, errno, "fsync");
+ glfs_close(g->fd);
+ g->fd = NULL;
+ return 1;
+ }
+ }
+ }
+ }
+ }