if (unlink_file || new_layout) {
dprint(FD_FILE, "layout unlink %s\n", f->file_name);
- if ((unlink(f->file_name) < 0) && (errno != ENOENT)) {
+ if ((td_io_unlink_file(td, f) < 0) && (errno != ENOENT)) {
td_verror(td, errno, "unlink");
return 1;
}
if (new_layout)
flags |= O_TRUNC;
+#ifdef WIN32
+ flags |= _O_BINARY;
+#endif
+
dprint(FD_FILE, "open file %s, flags %x\n", f->file_name, flags);
f->fd = open(f->file_name, flags, 0644);
if (f->fd < 0) {
if (td->terminate) {
dprint(FD_FILE, "terminate unlink %s\n", f->file_name);
- unlink(f->file_name);
+ td_io_unlink_file(td, f);
} else if (td->o.create_fsync) {
if (fsync(f->fd) < 0) {
td_verror(td, errno, "fsync");
unsigned long long ret, sized;
unsigned long r;
- if (td->o.use_os_rand) {
- r = os_random_long(&td->file_size_state);
- sized = td->o.file_size_high - td->o.file_size_low;
- ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0)));
- } else {
- r = __rand(&td->__file_size_state);
- sized = td->o.file_size_high - td->o.file_size_low;
- ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
- }
-
+ r = __rand(&td->file_size_state);
+ sized = td->o.file_size_high - td->o.file_size_low;
+ ret = (unsigned long long) ((double) sized * (r / (FRAND_MAX + 1.0)));
ret += td->o.file_size_low;
ret -= (ret % td->o.rw_min_bs);
return ret;
{
int ret = 0;
+#ifdef CONFIG_ESX
+ return 0;
+#endif
+
if (len == -1ULL)
len = f->io_size;
if (off == -1ULL)
dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off,
len);
- if (f->mmap_ptr) {
+ if (td->io_ops->invalidate)
+ ret = td->io_ops->invalidate(td, f);
+ else if (f->mmap_ptr) {
ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
#ifdef FIO_MADV_FREE
if (f->filetype == FIO_TYPE_BD)
from_hash = 0;
}
+#ifdef WIN32
+ flags |= _O_BINARY;
+#endif
+
f->fd = open(f->file_name, flags, 0600);
return from_hash;
}
}
td_verror(td, __e, buf);
+ return 1;
}
if (!from_hash && f->fd != -1) {
if (td->error != ENOENT) {
log_err("%s\n", td->verror);
err = 1;
+ break;
}
clear_error(td);
}
return f->real_file_size;
return td->o.start_offset +
- (td->thread_number - 1) * td->o.offset_increment;
+ td->subjob_number * td->o.offset_increment;
}
/*
}
}
- if (!o->size || o->size > total_size)
+ if (!o->size || (total_size && o->size > total_size))
o->size = total_size;
if (o->size < td_min_bs(td)) {
unsigned long seed;
seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
-
+
if (!lfsr_init(&f->lfsr, blocks, seed, 0))
continue;
} else if (!td->o.norandommap) {
dprint(FD_FILE, "close files\n");
for_each_file(td, f, i) {
+ if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
+ dprint(FD_FILE, "free unlink %s\n", f->file_name);
+ td_io_unlink_file(td, f);
+ }
+
if (fio_file_open(f))
td_io_close_file(td, f);
if (td->o.unlink && f->filetype == FIO_TYPE_FILE) {
dprint(FD_FILE, "free unlink %s\n", f->file_name);
- unlink(f->file_name);
+ td_io_unlink_file(td, f);
}
sfree(f->file_name);
void free_release_files(struct thread_data *td)
{
close_files(td);
+ td->o.nr_files = 0;
+ td->o.open_files = 0;
td->files_index = 0;
td->nr_normal_files = 0;
}