4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
27 * This file is part of Lustre, http://www.lustre.org/
29 * lustre/tests/ll_sparseness_verify.c
31 * The companion to ll_sparseness_write; walk all the bytes in the file.
32 * the bytes at the offsets specified on the command line must be '+', as
33 * previously written by ll_sparseness_write. All other bytes must be 0.
41 #include <sys/types.h>
47 #define BUFSIZE (1024 * 1024)
49 void error(char *fmt, ...)
54 vfprintf(stderr, fmt, ap);
59 int compare_offsets(const void *a, const void *b)
61 off_t *A = (off_t *)a;
62 off_t *B = (off_t *)b;
67 int main(int argc, char **argv)
69 unsigned int num_offsets, cur_off = 0, i;
70 off_t *offsets, pos = 0, end_of_buf = 0;
77 error("Usage: %s <filename> <offset> [ offset ... ]\n",
80 fd = open(argv[1], O_RDONLY);
82 error("couldn't open %s: %s\n", argv[1], strerror(errno));
84 buf = malloc(BUFSIZE);
86 error("can't allocate buffer\n");
88 num_offsets = argc - 2;
89 offsets = calloc(sizeof(offsets[0]), num_offsets);
90 for (i = 0; i < num_offsets; i++) {
91 offsets[i] = strtoul(argv[i + 2], &end, 10);
93 error("couldn't parse offset '%s'\n", argv[i + 2]);
95 qsort(offsets, num_offsets, sizeof(offsets[0]), compare_offsets);
97 if (fstat(fd, &st) < 0)
98 error("stat: %s\n", strerror(errno));
100 for (i = 0; pos < st.st_size; i++, pos++) {
101 if (pos == end_of_buf) {
102 ret = read(fd, buf, BUFSIZE);
104 error("read(): %s\n", strerror(errno));
105 end_of_buf = pos + ret;
106 if (end_of_buf > st.st_size)
107 error("read %d bytes past file size?\n",
108 end_of_buf - st.st_size);
112 /* check for 0 when we aren't at a given offset */
113 if (cur_off >= num_offsets || pos != offsets[cur_off]) {
115 error("found char 0x%x at pos %lu instead of 0x0\n",
120 /* the command line asks us to check for + at this offset */
122 error("found char 0x%x at pos %lu instead of '.'\n",
125 /* skip over duplicate offset arguments */
126 while (cur_off < num_offsets && offsets[cur_off] == pos)
129 /* don't bother freeing or closing.. */