do {
r = os_random_long(&td->random_state);
- b = ((max_blocks - 1) * r / (unsigned long long) (RAND_MAX+1.0));
+ if (!max_blocks)
+ b = 0;
+ else
+ b = ((max_blocks - 1) * r / (unsigned long long) (RAND_MAX+1.0));
if (td->norandommap)
break;
rb = b + (f->file_offset / td->min_bs[ddir]);
}
while (buflen + io_u->offset > f->real_file_size) {
- if (buflen == td->min_bs[ddir])
+ if (buflen == td->min_bs[ddir]) {
+ if (!td->odirect) {
+ assert(io_u->offset <= f->real_file_size);
+ buflen = f->real_file_size - io_u->offset;
+ return buflen;
+ }
return 0;
+ }
buflen = td->min_bs[ddir];
}
* probably not the right place to do this, but see
* if we need to open a new file
*/
- if (td->nr_open_files < td->nr_files &&
+ if (td->nr_open_files < td->open_files &&
td->open_files != td->nr_files) {
f = find_next_new_file(td);
if (!f || (ret = td_io_open_file(td, f))) {
put_io_u(td, io_u);
- break;
+ return NULL;
}
goto set_file;
}