static int fio_libpmem_open_file(struct thread_data *td, struct fio_file *f) { struct fio_libpmem_data *fdd; int ret; dprint(FD_IO,"DEBUG fio_libpmem_open_file\n"); dprint(FD_IO,"f->io_size=%ld \n",f->io_size); dprint(FD_IO,"td->o.size=%lld \n",td->o.size); dprint(FD_IO,"td->o.iodepth=%d\n",td->o.iodepth); dprint(FD_IO,"td->o.iodepth_batch=%d \n",td->o.iodepth_batch); ret = generic_open_file(td, f); if (ret) return ret; fdd = calloc(1, sizeof(*fdd)); if (!fdd) { int fio_unused __ret; __ret = generic_close_file(td, f); return 1; } FILE_SET_ENG_DATA(f, fdd); return 0; }
static int fio_mtd_open_file(struct thread_data *td, struct fio_file *f) { struct fio_mtd_data *fmd; int ret; ret = generic_open_file(td, f); if (ret) return ret; fmd = calloc(1, sizeof(*fmd)); if (!fmd) goto err_close; ret = mtd_get_dev_info(desc, f->file_name, &fmd->info); if (ret != 0) { td_verror(td, errno, "mtd_get_dev_info"); goto err_free; } FILE_SET_ENG_DATA(f, fmd); return 0; err_free: free(fmd); err_close: { int fio_unused __ret; __ret = generic_close_file(td, f); return 1; } }
static int fio_mtd_close_file(struct thread_data *td, struct fio_file *f) { struct fio_mtd_data *fmd = FILE_ENG_DATA(f); FILE_SET_ENG_DATA(f, NULL); free(fmd); return generic_close_file(td, f); }
static int fio_mmapio_close_file(struct thread_data *td, struct fio_file *f) { struct fio_mmap_data *fmd = FILE_ENG_DATA(f); FILE_SET_ENG_DATA(f, NULL); free(fmd); fio_file_clear_partial_mmap(f); return generic_close_file(td, f); }
static int fio_libpmem_close_file(struct thread_data *td, struct fio_file *f) { struct fio_libpmem_data *fdd = FILE_ENG_DATA(f); dprint(FD_IO,"DEBUG fio_libpmem_close_file\n"); dprint(FD_IO,"td->o.odirect %d \n",td->o.odirect); if (!td->o.odirect) { dprint(FD_IO,"pmem_drain\n"); pmem_drain(); } FILE_SET_ENG_DATA(f, NULL); free(fdd); fio_file_clear_partial_mmap(f); return generic_close_file(td, f); }
static int fio_mmapio_close(struct thread_data fio_unused *td, struct fio_file *f) { int ret = 0, ret2; if (f->mmap) { if (munmap(f->mmap, f->io_size) < 0) ret = errno; f->mmap = NULL; } ret2 = generic_close_file(td, f); if (!ret && ret2) ret = ret2; return ret; }
static int fio_mmapio_open_file(struct thread_data *td, struct fio_file *f) { struct fio_mmap_data *fmd; int ret; ret = generic_open_file(td, f); if (ret) return ret; fmd = calloc(1, sizeof(*fmd)); if (!fmd) { int fio_unused __ret; __ret = generic_close_file(td, f); return 1; } FILE_SET_ENG_DATA(f, fmd); return 0; }
int generic_open_file(struct thread_data *td, struct fio_file *f) { int is_std = 0; int flags = 0; int from_hash = 0; dprint(FD_FILE, "fd open %s\n", f->file_name); if (td_trim(td) && f->filetype != FIO_TYPE_BD) { log_err("fio: trim only applies to block device\n"); return 1; } if (!strcmp(f->file_name, "-")) { if (td_rw(td)) { log_err("fio: can't read/write to stdin/out\n"); return 1; } is_std = 1; /* * move output logging to stderr, if we are writing to stdout */ if (td_write(td)) f_out = stderr; } if (td_trim(td)) goto skip_flags; if (td->o.odirect) flags |= OS_O_DIRECT; if (td->o.sync_io) flags |= O_SYNC; if (td->o.create_on_open) flags |= O_CREAT; skip_flags: if (f->filetype != FIO_TYPE_FILE) flags |= FIO_O_NOATIME; open_again: if (td_write(td)) { if (!read_only) flags |= O_RDWR; if (f->filetype == FIO_TYPE_FILE) flags |= O_CREAT; if (is_std) f->fd = dup(STDOUT_FILENO); else from_hash = file_lookup_open(f, flags); } else if (td_read(td)) { if (f->filetype == FIO_TYPE_CHAR && !read_only) flags |= O_RDWR; else flags |= O_RDONLY; if (is_std) f->fd = dup(STDIN_FILENO); else from_hash = file_lookup_open(f, flags); } else { //td trim flags |= O_RDWR; from_hash = file_lookup_open(f, flags); } if (f->fd == -1) { char buf[FIO_VERROR_SIZE]; int __e = errno; if (__e == EPERM && (flags & FIO_O_NOATIME)) { flags &= ~FIO_O_NOATIME; goto open_again; } if (__e == EMFILE && file_close_shadow_fds(td)) goto open_again; snprintf(buf, sizeof(buf), "open(%s)", f->file_name); if (__e == EINVAL && (flags & OS_O_DIRECT)) { log_err("fio: looks like your file system does not " \ "support direct=1/buffered=0\n"); } td_verror(td, __e, buf); } if (!from_hash && f->fd != -1) { if (add_file_hash(f)) { int fio_unused ret; /* * Stash away descriptor for later close. This is to * work-around a "feature" on Linux, where a close of * an fd that has been opened for write will trigger * udev to call blkid to check partitions, fs id, etc. * That polutes the device cache, which can slow down * unbuffered accesses. */ if (f->shadow_fd == -1) f->shadow_fd = f->fd; else { /* * OK to ignore, we haven't done anything * with it */ ret = generic_close_file(td, f); } goto open_again; } } return 0; }
int generic_open_file(struct thread_data *td, struct fio_file *f) { int is_std = 0; int flags = 0; int from_hash = 0; dprint(FD_FILE, "fd open %s\n", f->file_name); if (!strcmp(f->file_name, "-")) { if (td_rw(td)) { log_err("fio: can't read/write to stdin/out\n"); return 1; } is_std = 1; /* * move output logging to stderr, if we are writing to stdout */ if (td_write(td)) f_out = stderr; } if (td->o.odirect) flags |= OS_O_DIRECT; if (td->o.sync_io) flags |= O_SYNC; if (f->filetype != FIO_TYPE_FILE) flags |= FIO_O_NOATIME; if (td->o.create_on_open) flags |= O_CREAT; open_again: if (td_write(td)) { if (!read_only) flags |= O_RDWR; if (f->filetype == FIO_TYPE_FILE) flags |= O_CREAT; if (is_std) f->fd = dup(STDOUT_FILENO); else from_hash = file_lookup_open(f, flags); } else { if (f->filetype == FIO_TYPE_CHAR && !read_only) flags |= O_RDWR; else flags |= O_RDONLY; if (is_std) f->fd = dup(STDIN_FILENO); else from_hash = file_lookup_open(f, flags); } if (f->fd == -1) { char buf[FIO_VERROR_SIZE]; int __e = errno; if (__e == EPERM && (flags & FIO_O_NOATIME)) { flags &= ~FIO_O_NOATIME; goto open_again; } snprintf(buf, sizeof(buf) - 1, "open(%s)", f->file_name); td_verror(td, __e, buf); } if (!from_hash && f->fd != -1) { if (add_file_hash(f)) { int fio_unused ret; /* * OK to ignore, we haven't done anything with it */ ret = generic_close_file(td, f); goto open_again; } } return 0; }