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, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 021110-1307, USA
24 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
25 * Use is subject to license terms.
27 * Copyright (c) 2014, 2017, Intel Corporation.
30 * This file is part of Lustre, http://www.lustre.org/
31 * Lustre is a trademark of Sun Microsystems, Inc.
37 #include <sys/types.h>
46 #include <lustre/lustreapi.h>
52 #define ACT_READHOLE 8
58 printf("usage: rwv -f filename <-r|-w> [-a] [-z] [-d] [-v]");
59 printf(" [-s offset] [-o[outf]] -n iovcnt SIZE1 SIZE2 SIZE3...\n");
60 printf("-a append IO (O_APPEND)\n");
61 printf("-r file read (O_RDONLY)\n");
62 printf("-w file write (O_WRONLY)\n");
63 printf("-s set the start pos of the read/write test\n");
64 printf("-z test for read hitting hole\n");
65 printf("-d create flags (O_LOV_DELAY_CREATE)\n");
66 printf("-v verify the data content of read\n");
67 printf("-o write the file content of read to an optional file\n");
70 int data_verify(struct iovec *iov, int iovcnt, char c)
74 for (i = 0; i < iovcnt; i++) {
75 size_t count = iov[i].iov_len;
76 char *s = iov[i].iov_base;
78 for (; count > 0; ++s, count--) {
80 printf("Data mismatch %x: %x\n", *s, c);
88 int main(int argc, char **argv)
100 unsigned long len = 0;
104 while ((c = getopt(argc, argv, "f:n:s:rwahvdzo::")) != -1) {
110 iovcnt = strtoul(optarg, &end, 0);
112 printf("Bad iov count: %s\n", optarg);
115 if (iovcnt > UIO_MAXIOV || iovcnt <= 0) {
116 printf("Wrong iov count\n");
122 offset = strtoull(optarg, &end, 0);
124 printf("Bad seek offset: %s\n", optarg);
130 flags |= O_WRONLY | O_CREAT;
140 flags |= O_LOV_DELAY_CREATE;
152 out_fd = open(optarg, O_WRONLY | O_CREAT, 0644);
154 out_fd = fileno(stdout);
162 if (act == ACT_NONE) {
167 if ((act & ACT_READ) && (act & ACT_WRITE)) {
168 printf("Read and write test should be exclusive\n");
172 if (act & ACT_OUTPUT && (!(act & ACT_READ) || out_fd < 0)) {
173 printf("-o not in read mode or cannot open the output file");
177 if (argc - optind < iovcnt) {
178 printf("Not enough parameters for iov size\n");
182 iov = (struct iovec *)malloc(iovcnt * sizeof(struct iovec));
184 printf("No memory %s\n", strerror(errno));
188 for (c = 0; c < iovcnt; c++) {
189 struct iovec *iv = &iov[c];
191 iv->iov_len = strtoul(argv[optind++], &end, 0);
193 printf("Error iov size\n");
197 iv->iov_base = mmap(NULL, iv->iov_len, PROT_READ | PROT_WRITE,
198 MAP_PRIVATE | MAP_ANON, 0, 0);
199 if (iv->iov_base == MAP_FAILED) {
200 printf("No memory %s\n", strerror(errno));
205 memset(iv->iov_base, pad, iv->iov_len);
209 fd = open(fname, O_LARGEFILE | flags, 0644);
211 printf("Cannot open %s:%s\n", fname, strerror(errno));
215 if ((act & ACT_SEEK) && (lseek64(fd, offset, SEEK_SET) < 0)) {
216 printf("Cannot seek %s\n", strerror(errno));
221 if (act & ACT_WRITE) {
222 rc = writev(fd, iov, iovcnt);
224 printf("Write error: %s (rc = %d, len = %ld)\n",
225 strerror(errno), rc, len);
229 } else if (act & ACT_READ) {
230 rc = readv(fd, iov, iovcnt);
232 printf("Read error: %s rc = %d\n", strerror(errno), rc);
237 /* It should return zeroed buf if the read hits hole.*/
238 if (((act & ACT_READHOLE) || (act & ACT_VERIFY)) &&
239 data_verify(iov, iovcnt, pad)) {
244 if (act & ACT_OUTPUT) {
245 rc = writev(out_fd, iov, iovcnt);
247 printf("write error: %s rc = %d\n",
248 strerror(errno), rc);