enum fio_ddir ddir)
{
unsigned long long max_blocks;
+ unsigned long long max_size;
- max_blocks = f->io_size / (unsigned long long) td->o.min_bs[ddir];
+ /*
+ * Hmm, should we make sure that ->io_size <= ->real_file_size?
+ */
+ max_size = f->io_size;
+ if (max_size > f->real_file_size)
+ max_size = f->real_file_size;
+
+ max_blocks = max_size / (unsigned long long) td->o.min_bs[ddir];
if (!max_blocks)
return 0;
static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
{
const int ddir = io_u->ddir;
- unsigned int buflen;
+ unsigned int buflen = buflen; /* silence dumb gcc warning */
long r;
if (td->o.min_bs[ddir] == td->o.max_bs[ddir])
static void set_rwmix_bytes(struct thread_data *td)
{
- unsigned long issues;
unsigned int diff;
/*
* buffered writes may issue a lot quicker than they complete,
* whereas reads do not.
*/
- issues = td->io_issues[td->rwmix_ddir] - td->rwmix_issues;
diff = td->o.rwmix[td->rwmix_ddir ^ 1];
-
- td->rwmix_issues = td->io_issues[td->rwmix_ddir]
- + (issues * ((100 - diff)) / diff);
+ td->rwmix_issues = (td->io_issues[td->rwmix_ddir] * diff) / 100;
}
static inline enum fio_ddir get_rand_ddir(struct thread_data *td)
r = os_random_long(&td->rwmix_state);
v = 1 + (int) (100.0 * (r / (RAND_MAX + 1.0)));
- if (v < td->o.rwmix[DDIR_READ])
+ if (v <= td->o.rwmix[DDIR_READ])
return DDIR_READ;
return DDIR_WRITE;