X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=612e79474dc4b43c0707d6a43dccf3d98a2f9e8f;hp=b04fb3e9b89362d1012883f594d9e6c7943e9fb3;hb=baa78fdc7dd42d54595a2678f759fe842f990912;hpb=22de5d7741f963e57dd5e3bb70d822e992dd2515 diff --git a/filesetup.c b/filesetup.c index b04fb3e9..612e7947 100644 --- a/filesetup.c +++ b/filesetup.c @@ -159,11 +159,18 @@ static int extend_file(struct thread_data *td, struct fio_file *f) } } - b = malloc(td->o.max_bs[DDIR_WRITE]); - left = f->real_file_size; + bs = td->o.max_bs[DDIR_WRITE]; + if (bs > left) + bs = left; + + b = malloc(bs); + if (!b) { + td_verror(td, errno, "malloc"); + goto err; + } + while (left && !td->terminate) { - bs = td->o.max_bs[DDIR_WRITE]; if (bs > left) bs = left; @@ -228,7 +235,11 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) unsigned int bs; char *b; - if (td_ioengine_flagged(td, FIO_PIPEIO)) + if (td_ioengine_flagged(td, FIO_PIPEIO) || + td_ioengine_flagged(td, FIO_NOIO)) + return 0; + + if (f->filetype == FIO_TYPE_CHAR) return 0; if (!fio_file_open(f)) { @@ -241,8 +252,17 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) old_runstate = td_bump_runstate(td, TD_PRE_READING); + left = f->io_size; bs = td->o.max_bs[DDIR_READ]; + if (bs > left) + bs = left; + b = malloc(bs); + if (!b) { + td_verror(td, errno, "malloc"); + ret = 1; + goto error; + } memset(b, 0, bs); if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) { @@ -252,8 +272,6 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) goto error; } - left = f->io_size; - while (left && !td->terminate) { if (bs > left) bs = left; @@ -447,7 +465,7 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, f->file_name); ret = td->io_ops->invalidate(td, f); if (ret < 0) - errval = ret; + errval = -ret; } else if (f->filetype == FIO_TYPE_FILE) { dprint(FD_IO, "declare unneeded cache %s: %llu/%llu\n", f->file_name, off, len); @@ -932,19 +950,17 @@ int setup_files(struct thread_data *td) } /* - * We normally don't come here, but if the result is 0, - * set it to the real file size. This could be size of - * the existing one if it already exists, but otherwise - * will be set to 0. A new file won't be created because + * We normally don't come here for regular files, but + * if the result is 0 for a regular file, set it to the + * real file size. This could be size of the existing + * one if it already exists, but otherwise will be set + * to 0. A new file won't be created because * ->io_size + ->file_offset equals ->real_file_size. */ if (!f->io_size) { if (f->file_offset > f->real_file_size) goto err_offset; f->io_size = f->real_file_size - f->file_offset; - log_info("fio: forcing file %s size to %llu\n", - f->file_name, - (unsigned long long)f->io_size); if (!f->io_size) log_info("fio: file %s may be ignored\n", f->file_name); @@ -1106,10 +1122,11 @@ int pre_read_files(struct thread_data *td) dprint(FD_FILE, "pre_read files\n"); for_each_file(td, f, i) { - pre_read_file(td, f); + if (pre_read_file(td, f)) + return -1; } - return 1; + return 0; } static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)