static int fio_pmemblk_get_file_size(struct thread_data *td, struct fio_file *f) { uint64_t flags = 0; fio_pmemblk_file_t pmb = FIOFILEPMBGET(f); if (fio_file_size_known(f)) return 0; if (!pmb) { if (pmb_get_flags(td, &flags)) return 1; pmb = pmb_open(f->file_name, flags); if (!pmb) return 1; } f->real_file_size = pmb->pmb_bsize * pmb->pmb_nblocks; fio_file_set_size_known(f); if (!FIOFILEPMBGET(f)) pmb_close(pmb, true); return 0; }
static int get_file_size(struct thread_data *td, struct fio_file *f) { int ret = 0; if (fio_file_size_known(f)) return 0; if (f->filetype == FIO_TYPE_FILE) ret = file_size(td, f); else if (f->filetype == FIO_TYPE_BD) ret = bdev_size(td, f); else if (f->filetype == FIO_TYPE_CHAR) ret = char_size(td, f); else f->real_file_size = -1; if (ret) return ret; if (f->file_offset > f->real_file_size) { log_err("%s: offset extends end (%llu > %llu)\n", td->o.name, (unsigned long long) f->file_offset, (unsigned long long) f->real_file_size); return 1; } fio_file_set_size_known(f); return 0; }
/* * The ->get_file_size() is called once for every job (i.e. numjobs) * before all other functions. This is called after ->setup() but * is simpler to initialize here since we only care about the device name * (given as file_name) and just have to specify the device size. */ static int fio_unvme_get_file_size(struct thread_data *td, struct fio_file *f) { TDEBUG("file=%s", f->file_name); if (!fio_file_size_known(f)) { if (do_unvme_init(f->file_name, td)) { error(0, 0, "%s do_unvme_init", __func__); return 1; } f->filetype = FIO_TYPE_CHAR; f->real_file_size = unvme.ns->blockcount * unvme.ns->blocksize; fio_file_set_size_known(f); } return 0; }