X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=5c45cae7f64103e0a8e30b16d7f704a2680f45e8;hp=493aa647ef4c9ae54e7056c54ea9a5f05bd68321;hb=0af7b542b69af5ab2400a9960a5bcde82c05723f;hpb=0d98aadc08078b16506ea5b3ceb9a93d36bbe038 diff --git a/fio.c b/fio.c index 493aa647..5c45cae7 100644 --- a/fio.c +++ b/fio.c @@ -302,7 +302,7 @@ static int get_next_offset(struct thread_data *td, unsigned long long *offset) b = td->last_pos / td->min_bs; *offset = (b * td->min_bs) + td->file_offset; - if (*offset > td->file_size) + if (*offset > td->real_file_size) return 1; return 0; @@ -628,8 +628,8 @@ static struct io_u *get_io_u(struct thread_data *td) return NULL; } - if (io_u->buflen + io_u->offset > td->file_size) - io_u->buflen = td->file_size - io_u->offset; + if (io_u->buflen + io_u->offset > td->real_file_size) + io_u->buflen = td->real_file_size - io_u->offset; if (!io_u->buflen) { put_io_u(td, io_u); @@ -1203,15 +1203,17 @@ static int file_size(struct thread_data *td) return 1; } - if (!td->file_size) - td->file_size = st.st_size; + td->real_file_size = st.st_size; + + if (!td->file_size || td->file_size > td->real_file_size) + td->file_size = td->real_file_size; return 0; } static int bdev_size(struct thread_data *td) { - size_t bytes; + unsigned long long bytes; int r; r = blockdev_size(td->fd, &bytes); @@ -1220,33 +1222,37 @@ static int bdev_size(struct thread_data *td) return 1; } + td->real_file_size = bytes; + /* * no extend possibilities, so limit size to device size if too large */ - if (!td->file_size || td->file_size > bytes) - td->file_size = bytes; + if (!td->file_size || td->file_size > td->real_file_size) + td->file_size = td->real_file_size; return 0; } static int get_file_size(struct thread_data *td) { - int ret; + int ret = 0; if (td->filetype == FIO_TYPE_FILE) ret = file_size(td); - else + else if (td->filetype == FIO_TYPE_BD) ret = bdev_size(td); + else + td->real_file_size = -1; if (ret) return ret; - if (td->file_offset > td->file_size) { - fprintf(stderr, "Client%d: offset larger than length (%Lu > %Lu)\n", td->thread_number, td->file_offset, td->file_size); + if (td->file_offset + td->file_size > td->real_file_size) { + fprintf(stderr, "Client%d: offset extends end (%Lu > %Lu)\n", td->thread_number, td->file_offset + td->file_size, td->real_file_size); return 1; } - td->io_size = td->file_size - td->file_offset; + td->io_size = td->file_size; if (td->io_size == 0) { fprintf(stderr, "Client%d: no io blocks\n", td->thread_number); td_verror(td, EINVAL); @@ -1352,9 +1358,14 @@ static int setup_file(struct thread_data *td) if (td->odirect) flags |= O_DIRECT; - if (td_read(td)) - td->fd = open(td->file_name, flags | O_RDONLY); - else { + if (td_read(td)) { + if (td->filetype == FIO_TYPE_CHAR) + flags |= O_RDWR; + else + flags |= O_RDONLY; + + td->fd = open(td->file_name, flags); + } else { if (td->filetype == FIO_TYPE_FILE) { if (!td->overwrite) flags |= O_TRUNC; @@ -1595,17 +1606,23 @@ static void init_disk_util(struct thread_data *td) return; /* - * if this is inside a partition dir, jump back to parent + * for md/dm, there's no queue dir. we already have the right place */ - sprintf(tmp, "%s/queue", foo); + sprintf(tmp, "%s/stat", foo); if (stat(tmp, &st)) { - p = dirname(foo); - sprintf(tmp, "%s/queue", p); + /* + * if this is inside a partition dir, jump back to parent + */ + sprintf(tmp, "%s/queue", foo); if (stat(tmp, &st)) { - fprintf(stderr, "unknown sysfs layout\n"); - return; + p = dirname(foo); + sprintf(tmp, "%s/queue", p); + if (stat(tmp, &st)) { + fprintf(stderr, "unknown sysfs layout\n"); + return; + } + sprintf(foo, "%s", p); } - sprintf(foo, "%s", p); } disk_util_add(dev, foo); @@ -1797,7 +1814,7 @@ static void show_ddir_status(struct thread_data *td, struct group_run_stats *rs, return; bw = td->io_bytes[ddir] / td->runtime[ddir]; - printf(" %s: io=%6luMiB, bw=%6luKiB/s, runt=%6lumsec\n", ddir_str[ddir], td->io_bytes[ddir] >> 20, bw, td->runtime[ddir]); + printf(" %s: io=%6lluMiB, bw=%6luKiB/s, runt=%6lumsec\n", ddir_str[ddir], td->io_bytes[ddir] >> 20, bw, td->runtime[ddir]); if (calc_lat(&td->slat_stat[ddir], &min, &max, &mean, &dev)) printf(" slat (msec): min=%5lu, max=%5lu, avg=%5.02f, dev=%5.02f\n", min, max, mean, dev); @@ -2124,9 +2141,9 @@ static void show_group_stats(struct group_run_stats *rs, int id) printf("\nRun status group %d (all jobs):\n", id); if (rs->max_run[DDIR_READ]) - printf(" READ: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", rs->io_mb[0], rs->agg[0], rs->min_bw[0], rs->max_bw[0], rs->min_run[0], rs->max_run[0]); + printf(" READ: io=%lluMiB, aggrb=%llu, minb=%llu, maxb=%llu, mint=%llumsec, maxt=%llumsec\n", rs->io_mb[0], rs->agg[0], rs->min_bw[0], rs->max_bw[0], rs->min_run[0], rs->max_run[0]); if (rs->max_run[DDIR_WRITE]) - printf(" WRITE: io=%luMiB, aggrb=%lu, minb=%lu, maxb=%lu, mint=%lumsec, maxt=%lumsec\n", rs->io_mb[1], rs->agg[1], rs->min_bw[1], rs->max_bw[1], rs->min_run[1], rs->max_run[1]); + printf(" WRITE: io=%lluMiB, aggrb=%llu, minb=%llu, maxb=%llu, mint=%llumsec, maxt=%llumsec\n", rs->io_mb[1], rs->agg[1], rs->min_bw[1], rs->max_bw[1], rs->min_run[1], rs->max_run[1]); } static void show_disk_util(void)