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)
79
printf(NAME ": Error, argument missing.\n");
88
printf(NAME ": Error, unexpected argument.\n");
95
buf = calloc(BUFELEMS, sizeof(uint64_t));
97
printf("Failed allocating buffer\n");
101
file = fopen(file_name, "r");
103
printf("Failed opening file\n");
111
struct timeval prev_time;
112
struct timeval start_time;
114
rc = gettimeofday(&start_time, NULL);
116
printf("gettimeofday failed\n");
121
prev_time = start_time;
123
while (!feof(file)) {
124
size_t elems = fread(buf, sizeof(uint64_t), BUFELEMS, file);
126
printf("Failed reading file\n");
132
for (i = 0; i < elems; i++) {
133
if (uint64_t_le2host(buf[i]) != expected) {
134
printf("Unexpected value at offset %" PRIuOFF64 "\n", offset);
140
offset += sizeof(uint64_t);
143
if (offset >= next_mark) {
144
struct timeval cur_time;
145
rc = gettimeofday(&cur_time, NULL);
147
printf("gettimeofday failed\n");
152
uint32_t last_run = cur_time.tv_sec - prev_time.tv_sec;
153
uint32_t total_time = cur_time.tv_sec - start_time.tv_sec;
154
if (last_run > 0 && total_time > 0) {
155
printf("%" PRIuOFF64 "M - time: %u s, "
156
"cur: %"PRIuOFF64 " B/s, avg: %" PRIuOFF64 " B/s\n",
157
offset / MBYTE, last_run,
158
(offset-last_mark)/last_run,
160
prev_time = cur_time;
174
static void syntax_print(void)
176
printf("syntax: testread <filename>\n");