/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * GPL HEADER START
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
*/
/* for O_DIRECT */
-#define _GNU_SOURCE
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
-#define CERROR(fmt, arg...) fprintf(stderr, fmt, ## arg)
-#ifndef __u64
-#define __u64 long long
-#define cpu_to_le64(v) (v)
-#define le64_to_cpu(v) (v)
-#endif
-
-#ifndef LPU64
-#define LPU64 "%Lu"
-#define LPX64 "%#Lx"
-#endif
+#include <liblustre.h>
#define READ 1
#define WRITE 2
#define LPDS sizeof(__u64)
-int page_debug_setup(void *addr, int len, __u64 off, __u64 id)
+int block_debug_setup(void *addr, int len, __u64 off, __u64 id)
{
off = cpu_to_le64(off);
id = cpu_to_le64(id);
return 0;
}
-int page_debug_check(char *who, void *addr, int size, __u64 off, __u64 id)
+int block_debug_check(char *who, void *addr, int size, __u64 off, __u64 id)
{
__u64 ne_off;
int err = 0;
char *buf;
long long count, last, offset;
long pg_vec, len;
- long long objid;
+ __u64 objid;
struct stat st;
int flags = 0;
int cmd = 0;
flags = O_RDWR | O_CREAT;
}
if (strchr(argv[3], 'd')) {
+#ifdef O_DIRECT
flags |= O_DIRECT;
+#else
+ fprintf(stderr,
+ "%s: O_DIRECT not supported in this build\n",
+ argv[0]);
+ exit(1);
+#endif
}
if (!cmd)
usage(argv[0]);
} else {
cmd = READ | WRITE;
- flags = O_RDWR | O_CREAT | O_DIRECT;
+ flags = O_RDWR | O_CREAT;
+#ifdef O_DIRECT
+ flags |= O_DIRECT;
+#else
+ fprintf(stderr, "%s: warning: not setting O_DIRECT\n",
+ argv[0]);
+#endif
}
if (argc >= 5) {
objid = 3;
}
- printf("%s: %s on %s(objid "LPX64") for "LPU64"x%ld pages \n",
- argv[0], flags & O_DIRECT ? "directio" : "i/o",
+ printf("%s: %s on %s(objid "LPX64") for %llux%ld pages \n",
+ argv[0],
+#ifdef O_DIRECT
+ flags & O_DIRECT ? "directio" : "i/o",
+#else
+ "i/o",
+#endif
argv[1], objid, count, pg_vec);
fd = open(argv[1], flags | O_LARGEFILE);
int i;
for (i = 0; i < len; i += st.st_blksize)
- page_debug_setup(buf + i, st.st_blksize, offset + i,
- objid);
+ block_debug_setup(buf + i, st.st_blksize,
+ offset + i, objid);
rc = write(fd, buf, len);
for (i = 0; i < len; i += st.st_blksize) {
- if (page_debug_check("write", buf + i, st.st_blksize,
- offset + i, objid))
+ if (block_debug_check("write", buf + i, st.st_blksize,
+ offset + i, objid))
return 10;
}
}
for (i = 0; i < len; i += st.st_blksize) {
- if (page_debug_check("read", buf + i, st.st_blksize,
- offset + i, objid))
+ if (block_debug_check("read", buf + i, st.st_blksize,
+ offset + i, objid))
return 11;
}
}