return ret;
}
-static unsigned long long get_rand_file_size(struct thread_data *td)
+unsigned long long get_rand_file_size(struct thread_data *td)
{
unsigned long long ret, sized;
uint64_t frand_max;
int r;
if (td->io_ops->open_file(td, f)) {
- log_err("fio: failed opening blockdev %s for size check\n",
+ log_err("fio: failed opening chardev %s for size check\n",
f->file_name);
return 1;
}
unsigned long long off,
unsigned long long len)
{
- int ret = 0;
+ int errval = 0, ret = 0;
#ifdef CONFIG_ESX
return 0;
dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
len);
- if (td->io_ops->invalidate)
+ if (td->io_ops->invalidate) {
ret = td->io_ops->invalidate(td, f);
- else if (f->filetype == FIO_TYPE_FILE)
+ if (ret < 0)
+ errval = ret;
+ } else if (f->filetype == FIO_TYPE_FILE) {
ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
- else if (f->filetype == FIO_TYPE_BD) {
+ if (ret)
+ errval = ret;
+ } else if (f->filetype == FIO_TYPE_BD) {
+ int retry_count = 0;
+
ret = blockdev_invalidate_cache(f);
+ while (ret < 0 && errno == EAGAIN && retry_count++ < 25) {
+ /*
+ * Linux multipath devices reject ioctl while
+ * the maps are being updated. That window can
+ * last tens of milliseconds; we'll try up to
+ * a quarter of a second.
+ */
+ usleep(10000);
+ ret = blockdev_invalidate_cache(f);
+ }
if (ret < 0 && errno == EACCES && geteuid()) {
if (!root_warn) {
log_err("fio: only root may flush block "
}
ret = 0;
}
+ if (ret < 0)
+ errval = errno;
} else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE)
ret = 0;
* function to flush eg block device caches. So just warn and
* continue on our way.
*/
- if (ret) {
- log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errno));
- ret = 0;
- }
+ if (errval)
+ log_info("fio: cache invalidation of %s failed: %s\n", f->file_name, strerror(errval));
return 0;
*/
total_size = 0;
for_each_file(td, f, i) {
+ f->fileno = i;
if (f->real_file_size == -1ULL)
total_size = -1ULL;
else
if (f->io_size == -1ULL)
total_size = -1ULL;
else {
- if (o->size_percent)
- f->io_size = (f->io_size * o->size_percent) / 100;
+ if (o->size_percent) {
+ f->io_size = (f->io_size * o->size_percent) / 100;
+ f->io_size -= (f->io_size % td_min_bs(td));
+ }
total_size += f->io_size;
}
}
td->ts.nr_block_infos = len;
- for (int i = 0; i < len; i++)
+ for (i = 0; i < len; i++)
td->ts.block_infos[i] =
BLOCK_INFO(0, BLOCK_STATE_UNINIT);
} else
*/
if (need_extend) {
temp_stall_ts = 1;
- if (output_format == FIO_OUTPUT_NORMAL)
+ if (output_format & FIO_OUTPUT_NORMAL)
log_info("%s: Laying out IO file(s) (%u file(s) /"
" %lluMB)\n", o->name, need_extend,
extend_size >> 20);
else
f->filetype = FIO_TYPE_FILE;
+#ifdef WIN32
/* \\.\ is the device namespace in Windows, where every file is
* a block device */
if (strncmp(f->file_name, "\\\\.\\", 4) == 0)
f->filetype = FIO_TYPE_BD;
+#endif
if (!stat(f->file_name, &sb)) {
if (S_ISBLK(sb.st_mode))
dprint(FD_FILE, "add file %s\n", fname);
if (td->o.directory)
- len = set_name_idx(file_name, PATH_MAX, td->o.directory, numjob);
+ len = set_name_idx(file_name, PATH_MAX, td->o.directory, numjob,
+ td->o.unique_filename);
sprintf(file_name + len, "%s", fname);