1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
6 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 only,
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License version 2 for more details (a copy is included
16 * in the LICENSE file that accompanied this code).
18 * You should have received a copy of the GNU General Public License
19 * version 2 along with this program; If not, see
20 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
22 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23 * CA 95054 USA or visit www.sun.com if you need additional information or
29 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
30 * Use is subject to license terms.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lustre/tests/ll_sparseness_verify.c
38 * The companion to ll_sparseness_write; walk all the bytes in the file.
39 * the bytes at the offsets specified on the command line must be '+', as
40 * previously written by ll_sparseness_write. All other bytes must be 0.
48 #include <sys/types.h>
54 #define BUFSIZE (1024*1024)
56 void error(char *fmt, ...)
60 vfprintf(stderr, fmt, ap);
65 int compare_offsets(const void *a, const void *b)
67 off_t *A = (off_t *)a;
68 off_t *B = (off_t *)b;
72 int main(int argc, char **argv)
74 unsigned int num_offsets, cur_off = 0, i;
75 off_t *offsets, pos = 0, end_of_buf = 0;
82 error("Usage: %s <filename> <offset> [ offset ... ]\n",
85 fd = open(argv[1], O_RDONLY);
87 error("couldn't open %s: %s\n", argv[1], strerror(errno));
89 buf = malloc(BUFSIZE);
91 error("can't allocate buffer\n");
93 num_offsets = argc - 2;
94 offsets = calloc(sizeof(offsets[0]), num_offsets);
95 for (i = 0; i < num_offsets; i++) {
96 offsets[i] = strtoul(argv[i + 2], &end, 10);
98 error("couldn't parse offset '%s'\n", argv[i + 2]);
100 qsort(offsets, num_offsets, sizeof(offsets[0]), compare_offsets);
102 if (fstat(fd, &st) < 0)
103 error("stat: %s\n", strerror(errno));
105 for (i = 0; pos < st.st_size; i++, pos++) {
106 if (pos == end_of_buf) {
107 ret = read(fd, buf, BUFSIZE);
109 error("read(): %s\n", strerror(errno));
110 end_of_buf = pos + ret;
111 if (end_of_buf > st.st_size)
112 error("read %d bytes past file size?\n",
113 end_of_buf - st.st_size);
117 /* check for 0 when we aren't at a given offset */
118 if (cur_off >= num_offsets || pos != offsets[cur_off]) {
120 error("found char 0x%x at pos %lu instead of "
121 "0x0\n", buf[i], (long)pos);
125 /* the command line asks us to check for + at this offset */
127 error("found char 0x%x at pos %lu instead of "
128 "'.'\n", buf[i], (long)pos);
130 /* skip over duplicate offset arguments */
131 while (cur_off < num_offsets && offsets[cur_off] == pos)
134 /* don't bother freeing or closing.. */