Don't completely fail for block device flushing failure
[fio.git] / filesetup.c
index d8b7401b35e0230d9f40afe53dcbfcd5e84b83e1..fb9219199e31ca378a24b2662f246167abe6a3fe 100644 (file)
@@ -155,11 +155,15 @@ static int create_files(struct thread_data *td)
 
                f->file_offset = td->o.start_offset;
 
-               if (f->filetype != FIO_TYPE_FILE)
-                       continue;
                if (!total_file_size)
                        continue;
 
+               if (f->filetype != FIO_TYPE_FILE) {
+                       if (!f->file_size)
+                               f->file_size = total_file_size / td->o.nr_files;
+                       continue;
+               }
+
                if (f->flags & FIO_FILE_EXISTS) {
                        if ((f->file_size > td->o.size / td->o.nr_files) ||
                            !f->file_size)
@@ -249,6 +253,7 @@ static int create_files(struct thread_data *td)
                        if (td->o.unlink)
                                f->flags |= FIO_FILE_UNLINK;
 
+                       f->flags |= FIO_FILE_NOSORT;
                        err = create_file(td, f);
                        if (err)
                                break;
@@ -339,9 +344,13 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f)
                ret = madvise(f->mmap, f->file_size, MADV_DONTNEED);
        else if (f->filetype == FIO_TYPE_FILE)
                ret = fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_DONTNEED);
-       else if (f->filetype == FIO_TYPE_BD)
+       else if (f->filetype == FIO_TYPE_BD) {
                ret = blockdev_invalidate_cache(f->fd);
-       else if (f->filetype == FIO_TYPE_CHAR)
+               if (ret < 0 && errno == EACCES && geteuid()) {
+                       log_err("fio: only root may flush block devices. Cache flush bypassed!\n");
+                       ret = 0;
+               }
+       } else if (f->filetype == FIO_TYPE_CHAR)
                ret = 0;
 
        if (ret < 0) {