}
b = malloc(td->o.max_bs[DDIR_WRITE]);
- memset(b, 0, td->o.max_bs[DDIR_WRITE]);
left = f->real_file_size;
while (left && !td->terminate) {
if (bs > left)
bs = left;
+ fill_io_buffer(td, b, bs, bs);
+
r = write(f->fd, b, bs);
if (r > 0) {
if (f->file_offset > f->real_file_size) {
log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
- f->file_offset, f->real_file_size);
+ (unsigned long long) f->file_offset,
+ (unsigned long long) f->real_file_size);
return 1;
}
if (f->mmap_ptr) {
ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
#ifdef FIO_MADV_FREE
- (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
+ if (f->filetype == FIO_TYPE_BD)
+ (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
#endif
} else if (f->filetype == FIO_TYPE_FILE) {
ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
f->shadow_fd = -1;
}
+ f->engine_data = 0;
return ret;
}
goto skip_flags;
if (td->o.odirect)
flags |= OS_O_DIRECT;
+ if (td->o.oatomic) {
+ if (!FIO_O_ATOMIC) {
+ td_verror(td, EINVAL, "OS does not support atomic IO");
+ return 1;
+ }
+ flags |= OS_O_DIRECT | FIO_O_ATOMIC;
+ }
if (td->o.sync_io)
flags |= O_SYNC;
if (td->o.create_on_open)
* 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
+ * That pollutes the device cache, which can slow down
* unbuffered accesses.
*/
if (f->shadow_fd == -1)
struct fio_file *f;
unsigned int i;
int err = 0, need_extend;
+ int old_state;
dprint(FD_FILE, "setup files\n");
+ old_state = td->runstate;
+ td_set_runstate(td, TD_SETTING_UP);
+
if (o->read_iolog_file)
goto done;
err = get_file_sizes(td);
if (err)
- return err;
+ goto err_out;
/*
* check sizes. if the files/devices do not exist and the size
!(o->nr_files && (o->file_size_low || o->file_size_high))) {
log_err("%s: you need to specify size=\n", o->name);
td_verror(td, EINVAL, "total_file_size");
- return 1;
+ goto err_out;
}
/*
}
if (err)
- return err;
+ goto err_out;
if (!o->zone_size)
o->zone_size = o->size;
if (o->create_only)
td->done = 1;
+ td_set_runstate(td, old_state);
return 0;
err_offset:
log_err("%s: you need to specify valid offset=\n", o->name);
+err_out:
+ td_set_runstate(td, old_state);
return 1;
}