X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=58c5015c97f1ddbe5150fad0ef11af006de58d9f;hp=b742f82501f019befc3fbccdff382151d8a0f5af;hb=67a1000f49db76ddb18ce9420ba03059af0214b9;hpb=7172cfe8e0e918cc279eb501986f6ec78cc7aad9 diff --git a/filesetup.c b/filesetup.c index b742f825..58c5015c 100644 --- a/filesetup.c +++ b/filesetup.c @@ -104,7 +104,7 @@ static unsigned long long get_rand_file_size(struct thread_data *td) long r; r = os_random_long(&td->file_size_state); - ret = td->o.file_size_low + (unsigned long long) ((double) td->o.file_size_high * (r / (RAND_MAX + 1.0))); + ret = td->o.file_size_low + (unsigned long long) ((double) (td->o.file_size_high - td->o.file_size_low) * (r / (RAND_MAX + 1.0))); ret -= (ret % td->o.rw_min_bs); return ret; } @@ -378,6 +378,8 @@ int setup_files(struct thread_data *td) extend_size = total_size = 0; need_extend = 0; for_each_file(td, f, i) { + f->file_offset = td->o.start_offset; + if (!td->o.file_size_low) { /* * no file size range given, file size is equal to @@ -385,20 +387,27 @@ int setup_files(struct thread_data *td) * zero, set it to the real file size. */ f->io_size = td->o.size / td->o.nr_files; - if (!f->io_size) - f->io_size = f->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; + } } else if (f->real_file_size < td->o.file_size_low || f->real_file_size > td->o.file_size_high) { + if (f->file_offset > td->o.file_size_low) + goto err_offset; /* * file size given. if it's fixed, use that. if it's a * range, generate a random size in-between. */ if (td->o.file_size_low == td->o.file_size_high) - f->io_size = td->o.file_size_low; + f->io_size = td->o.file_size_low - f->file_offset; else - f->io_size = get_rand_file_size(td); - } else - f->io_size = f->real_file_size; + f->io_size = get_rand_file_size(td) - f->file_offset; + } else if (f->file_offset > f->real_file_size) + goto err_offset; + else + f->io_size = f->real_file_size - f->file_offset; if (f->io_size == -1ULL) total_size = -1ULL; @@ -406,15 +415,15 @@ int setup_files(struct thread_data *td) total_size += f->io_size; if (f->filetype == FIO_TYPE_FILE && - f->io_size > f->real_file_size && + (f->io_size + f->file_offset) > f->real_file_size && !(td->io_ops->flags & FIO_DISKLESSIO)) { need_extend++; - extend_size += f->io_size; + extend_size += (f->io_size + f->file_offset); f->flags |= FIO_FILE_EXTEND; - } + } } - if (!td->o.size) + if (!td->o.size || td->o.size > total_size) td->o.size = total_size; /* @@ -431,7 +440,7 @@ int setup_files(struct thread_data *td) assert(f->filetype == FIO_TYPE_FILE); f->flags &= ~FIO_FILE_EXTEND; - f->real_file_size = f->io_size; + f->real_file_size = (f->io_size + f->file_offset); err = extend_file(td, f); if (err) break; @@ -447,6 +456,9 @@ int setup_files(struct thread_data *td) td->total_io_size = td->o.size * td->o.loops; return 0; +err_offset: + log_err("%s: you need to specify valid offset=\n", td->o.name); + return 1; } int init_random_map(struct thread_data *td)