#include "fio.h"
#include "smalloc.h"
#include "filehash.h"
+#include "os/os.h"
static int root_warn;
}
}
#endif
-
+
if (!new_layout)
goto done;
static int bdev_size(struct thread_data *td, struct fio_file *f)
{
- unsigned long long bytes;
+ unsigned long long bytes = 0;
int r;
if (td->io_ops->open_file(td, f)) {
return 1;
}
- r = blockdev_size(f->fd, &bytes);
+ r = blockdev_size(f, &bytes);
if (r) {
td_verror(td, r, "blockdev_size");
+ printf("fd is %d\n", f->fd);
goto err;
}
static int char_size(struct thread_data *td, struct fio_file *f)
{
#ifdef FIO_HAVE_CHARDEV_SIZE
- unsigned long long bytes;
+ unsigned long long bytes = 0;
int r;
if (td->io_ops->open_file(td, f)) {
return 1;
}
- r = chardev_size(f->fd, &bytes);
+ r = chardev_size(f, &bytes);
if (r) {
td_verror(td, r, "chardev_size");
goto err;
return ret;
if (f->file_offset > f->real_file_size) {
- log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name,
+ log_err("%s: offset extends end (%llu > %llu)\n", td->o.name,
f->file_offset, f->real_file_size);
return 1;
}
* FIXME: add blockdev flushing too
*/
if (f->mmap_ptr) {
- ret = madvise(f->mmap_ptr, f->mmap_sz, MADV_DONTNEED);
+ ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED);
#ifdef FIO_MADV_FREE
- (void) madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
+ (void) posix_madvise(f->mmap_ptr, f->mmap_sz, FIO_MADV_FREE);
#endif
} else if (f->filetype == FIO_TYPE_FILE) {
- ret = fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
+ ret = posix_fadvise(f->fd, off, len, POSIX_FADV_DONTNEED);
} else if (f->filetype == FIO_TYPE_BD) {
- ret = blockdev_invalidate_cache(f->fd);
+ ret = blockdev_invalidate_cache(f);
if (ret < 0 && errno == EACCES && geteuid()) {
if (!root_warn) {
log_err("fio: only root may flush block "
temp_stall_ts = 1;
if (!terse_output)
log_info("%s: Laying out IO file(s) (%u file(s) /"
- " %LuMB)\n", td->o.name, need_extend,
+ " %lluMB)\n", td->o.name, need_extend,
extend_size >> 20);
for_each_file(td, f, i) {
(unsigned long long) td->o.rw_min_bs;
num_maps = (blocks + BLOCKS_PER_MAP - 1) /
(unsigned long long) BLOCKS_PER_MAP;
- f->file_map = smalloc(num_maps * sizeof(int));
+ f->file_map = smalloc(num_maps * sizeof(unsigned long));
if (f->file_map) {
f->num_maps = num_maps;
continue;
f->filetype = FIO_TYPE_FILE;
if (!stat(f->file_name, &sb)) {
- if (S_ISBLK(sb.st_mode))
+ /* \\.\ is the device namespace in Windows, where every file is
+ * a block device */
+ if (S_ISBLK(sb.st_mode) || strncmp(f->file_name, "\\\\.\\", 4) == 0)
f->filetype = FIO_TYPE_BD;
else if (S_ISCHR(sb.st_mode))
f->filetype = FIO_TYPE_CHAR;
return cur_files;
}
+int add_file_exclusive(struct thread_data *td, const char *fname)
+{
+ struct fio_file *f;
+ unsigned int i;
+
+ for_each_file(td, f, i) {
+ if (!strcmp(f->file_name, fname))
+ return i;
+ }
+
+ return add_file(td, fname);
+}
+
void get_file(struct fio_file *f)
{
dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references);