X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=ad7fb8551da7b87889e3e0ec5d087089e918b5fd;hp=bf05b6f000e4caf6158c4f0783ca9d5806fa6cc8;hb=890b665611751661aac1030603175bb7bbde34bc;hpb=e413c2ccf8af0a0bce29530568ded346a894cf3d diff --git a/filesetup.c b/filesetup.c index bf05b6f0..ad7fb855 100644 --- a/filesetup.c +++ b/filesetup.c @@ -38,7 +38,7 @@ static int extend_file(struct thread_data *td, struct fio_file *f) int r, new_layout = 0, unlink_file = 0, flags; unsigned long long left; unsigned int bs; - char *b; + char *b = NULL; if (read_only) { log_err("fio: refusing extend of file due to read-only\n"); @@ -69,6 +69,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f) 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) { @@ -189,6 +193,8 @@ done: err: close(f->fd); f->fd = -1; + if (b) + free(b); return 1; } @@ -395,9 +401,6 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, dprint(FD_IO, "invalidate cache %s: %llu/%llu\n", f->file_name, off, len); - /* - * FIXME: add blockdev flushing too - */ if (f->mmap_ptr) { ret = posix_madvise(f->mmap_ptr, f->mmap_sz, POSIX_MADV_DONTNEED); #ifdef FIO_MADV_FREE @@ -419,15 +422,18 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, } else if (f->filetype == FIO_TYPE_CHAR || f->filetype == FIO_TYPE_PIPE) ret = 0; - if (ret < 0) { - td_verror(td, errno, "invalidate_cache"); - return 1; - } else if (ret > 0) { - td_verror(td, ret, "invalidate_cache"); - return 1; + /* + * Cache flushing isn't a fatal condition, and we know it will + * happen on some platforms where we don't have the proper + * 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; } - return ret; + return 0; } @@ -479,6 +485,10 @@ int file_lookup_open(struct fio_file *f, int flags) from_hash = 0; } +#ifdef WIN32 + flags |= _O_BINARY; +#endif + f->fd = open(f->file_name, flags, 0600); return from_hash; } @@ -686,7 +696,8 @@ static unsigned long long get_fs_free_counts(struct thread_data *td) } else if (f->filetype != FIO_TYPE_FILE) continue; - strcpy(buf, f->file_name); + buf[255] = '\0'; + strncpy(buf, f->file_name, 255); if (stat(buf, &sb) < 0) { if (errno != ENOENT) @@ -708,8 +719,8 @@ static unsigned long long get_fs_free_counts(struct thread_data *td) if (fm) continue; - fm = malloc(sizeof(*fm)); - strcpy(fm->__base, buf); + fm = calloc(1, sizeof(*fm)); + strncpy(fm->__base, buf, sizeof(fm->__base) - 1); fm->base = basename(fm->__base); fm->key = sb.st_dev; flist_add(&fm->list, &list); @@ -882,6 +893,11 @@ int setup_files(struct thread_data *td) if (!o->size || o->size > total_size) o->size = total_size; + if (o->size < td_min_bs(td)) { + log_err("fio: blocksize too large for data set\n"); + goto err_out; + } + /* * See if we need to extend some files */ @@ -912,7 +928,13 @@ int setup_files(struct thread_data *td) err = __file_invalidate_cache(td, f, old_len, extend_len); - close(f->fd); + + /* + * Shut up static checker + */ + if (f->fd != -1) + close(f->fd); + f->fd = -1; if (err) break; @@ -930,8 +952,12 @@ int setup_files(struct thread_data *td) * iolog already set the total io size, if we read back * stored entries. */ - if (!o->read_iolog_file) - td->total_io_size = o->size * o->loops; + if (!o->read_iolog_file) { + if (o->io_limit) + td->total_io_size = o->io_limit * o->loops; + else + td->total_io_size = o->size * o->loops; + } done: if (o->create_only) @@ -1022,7 +1048,7 @@ int init_random_map(struct thread_data *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) { @@ -1279,13 +1305,6 @@ int add_file(struct thread_data *td, const char *fname, int numjob, int inc) set_already_allocated(file_name); - /* - * For adding files after the fact - if openfiles= isn't - * given as an option, ensure we allow at least one file open - */ - if (!td->o.open_files) - td->o.open_files = 1; - if (inc) td->o.nr_files++; @@ -1330,8 +1349,11 @@ int put_file(struct thread_data *td, struct fio_file *f) if (--f->references) return 0; - if (should_fsync(td) && td->o.fsync_on_close) + if (should_fsync(td) && td->o.fsync_on_close) { f_ret = fsync(f->fd); + if (f_ret < 0) + f_ret = errno; + } if (td->io_ops->close_file) ret = td->io_ops->close_file(td, f); @@ -1409,7 +1431,8 @@ static int recurse_dir(struct thread_data *td, const char *dirname) if (lstat(full_path, &sb) == -1) { if (errno != ENOENT) { td_verror(td, errno, "stat"); - return 1; + ret = 1; + break; } }