2
* Copyright (c) 2011 Martin Sucha
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* - Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* - Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
* - The name of the author may not be used to endorse or promote products
15
* derived from this software without specific prior written permission.
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
* This program checks if the file contains a pattern of increasing
36
* 64 bit unsigned integers (that may overflow at some point)
37
* stored in little endian byte order.
38
* This is to verify that the filesystem reads
39
* the files correctly.
40
* If the file does not contain specified pattern, it stops
41
* at the point where the file does not match and prints
42
* the byte offset at which the error occured.
43
* While checking the file, the program displays how many megabytes
44
* it has already read, how long it took to read the last megabyte
45
* and current and average read speed.
53
#include <byteorder.h>
54
#include <sys/types.h>
55
#include <sys/typefmt.h>
60
#define NAME "testread"
62
#define MBYTE (1024*1024)
64
static void syntax_print(void);
66
int main(int argc, char **argv)
77
bool check_enabled = true;
81
printf(NAME ": Error, argument missing.\n");
86
/* Skip program name */
89
if (argc > 0 && str_cmp(*argv, "--no-check") == 0) {
90
check_enabled = false;
94
if (argc > 0 && str_cmp(*argv, "--no-progress") == 0) {
100
printf(NAME ": Error, unexpected argument.\n");
107
buf = calloc(BUFELEMS, sizeof(uint64_t));
109
printf("Failed allocating buffer\n");
113
file = fopen(file_name, "r");
115
printf("Failed opening file\n");
123
struct timeval prev_time;
124
struct timeval start_time;
126
rc = gettimeofday(&start_time, NULL);
128
printf("gettimeofday failed\n");
133
prev_time = start_time;
135
while (!feof(file)) {
136
size_t elems = fread(buf, sizeof(uint64_t), BUFELEMS, file);
138
printf("Failed reading file\n");
144
for (i = 0; i < elems; i++) {
145
if (check_enabled && uint64_t_le2host(buf[i]) != expected) {
146
printf("Unexpected value at offset %" PRIuOFF64 "\n", offset);
152
offset += sizeof(uint64_t);
155
if (progress && offset >= next_mark) {
156
struct timeval cur_time;
157
rc = gettimeofday(&cur_time, NULL);
159
printf("gettimeofday failed\n");
164
uint32_t last_run = cur_time.tv_sec - prev_time.tv_sec;
165
uint32_t total_time = cur_time.tv_sec - start_time.tv_sec;
166
if (last_run > 0 && total_time > 0) {
167
printf("%" PRIuOFF64 "M - time: %u s, "
168
"cur: %"PRIuOFF64 " B/s, avg: %" PRIuOFF64 " B/s\n",
169
offset / MBYTE, last_run,
170
(offset-last_mark)/last_run,
172
prev_time = cur_time;
179
struct timeval final_time;
180
rc = gettimeofday(&final_time, NULL);
182
printf("gettimeofday failed\n");
188
uint32_t total_run_time = final_time.tv_sec - start_time.tv_sec;
189
if (total_run_time > 0) {
190
printf("total bytes: %" PRIuOFF64
191
", total time: %u s, avg speed: %" PRIuOFF64 " B/s\n",
194
offset/total_run_time);
204
static void syntax_print(void)
206
printf("syntax: testread <filename>\n");