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 2008 Sun Microsystems, Inc. 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/lp_utils.c
38 * Author: You Feng <youfeng@clusterfs.com>
46 #include <sys/types.h>
47 #include <asm/types.h>
50 #include <sys/ioctl.h>
53 #include <libcfs/libcfs.h>
54 #include "lustre/lustre_user.h"
57 #define MAX_PROCESSES 8
64 struct timeval t1, t2;
67 static char datestring[80];
71 timestamp = time(NULL);
72 strftime(datestring, 80, "%T", localtime(×tamp));
77 inline void begin(char *str) {
78 if (verbose > 0 && rank == 0) {
79 gettimeofday(&t1, NULL);
80 printf("%s:\tBeginning %s\n", timestamp(), str);
85 inline void end(char *str) {
88 MPI_Barrier(MPI_COMM_WORLD);
89 if (verbose > 0 && rank == 0) {
90 gettimeofday(&t2, NULL);
91 elapsed = (t2.tv_sec + ((float)t2.tv_usec/1000000))
92 - (t1.tv_sec + ((float)t1.tv_usec/1000000));
94 printf("%s:\tFinished %-15s(%.2f min)\n",
95 timestamp(), str, elapsed / 60);
97 printf("%s:\tFinished %-15s(%.3f sec)\n",
98 timestamp(), str, elapsed);
105 void dump_diff(char *orig_buf, char *buf, int size, long _off)
110 printf("commpared buf size %d, at offset %lu\n\n", size, _off);
113 printf("original buf:\n");
115 end = orig_buf + size;
118 printf(" %8lx", *(long *)p);
123 if (i%8) printf("\n\n");
128 printf("different data: diff_data(orig_data)\n");
135 if (memcmp(p, orig_buf + off, sizeof(long)) != 0) {
136 printf("\toff: %5d,\tdata: %8lx (%8lx)\n", off,
138 *(unsigned long *)(orig_buf + off));
144 printf("\n %d total differents found\n\n", diff);
148 void lp_gethostname(void)
150 if (gethostname(hostname, 1024) == -1) {
151 fprintf(stderr, "gethostname: (%d)%s", errno, strerror(errno));
152 MPI_Abort(MPI_COMM_WORLD, 2);
156 /* This function does not FAIL if the requested "name" does not exit.
157 * This is just to clean up any files or directories left over from
160 void remove_file_or_dir(char *name)
163 char errmsg[MAX_FILENAME_LEN + 20];
165 if (stat(name, &statbuf) != -1) {
166 if (S_ISREG(statbuf.st_mode)) {
167 printf("stale file found\n");
168 if (unlink(name) == -1) {
169 sprintf(errmsg, "unlink of %s", name);
173 if (S_ISDIR(statbuf.st_mode)) {
174 printf("stale directory found\n");
175 if (rmdir(name) == -1) {
176 sprintf(errmsg, "rmdir of %s", name);
183 void create_file(char *name, long filesize, int fill)
185 static char filename[MAX_FILENAME_LEN];
186 char errmsg[MAX_FILENAME_LEN + 20];
191 long left = filesize;
193 /* Process 0 creates the test file(s) */
195 sprintf(filename, "%s/%s", testdir, name);
196 remove_file_or_dir(filename);
197 if ((fd = creat(filename, FILEMODE)) == -1) {
198 sprintf(errmsg, "create of file %s", filename);
202 if (lseek(fd, filesize - 1, SEEK_SET) == -1) {
204 sprintf(errmsg, "lseek of file %s", filename);
207 if (write(fd, &zero, 1) == -1) {
209 sprintf(errmsg, "write of file %s", filename);
213 if (filesize > 0 && fill) {
214 if (lseek(fd, 0, SEEK_SET) == -1) {
216 sprintf(errmsg, "lseek of file %s", filename);
219 memset(buf, c, 1024);
221 if ((rc = write(fd, buf,
222 left > (1024 * 8) ? (1024 * 8) : left))
225 sprintf(errmsg, "write of file %s", filename);
231 if (close(fd) == -1) {
232 sprintf(errmsg, "close of file %s", filename);
238 void check_stat(char *filename, struct stat *state, struct stat *old_state)
240 char errmsg[MAX_FILENAME_LEN+20];
242 if (stat(filename, state) == -1) {
243 sprintf(errmsg, "stat of file %s", filename);
247 if (memcmp(state, old_state, sizeof(struct stat)) != 0) {
249 sprintf(errmsg, LP_STAT_FMT, LP_STAT_ARGS);
254 void remove_file(char *name)
256 char filename[MAX_FILENAME_LEN];
257 char errmsg[MAX_FILENAME_LEN + 20];
259 /* Process 0 remove the file(s) */
261 sprintf(filename, "%s/%s", testdir, name);
262 if (unlink(filename) == -1) {
263 sprintf(errmsg, "unlink of file %s", filename);
269 void fill_stride(char *buf, int buf_size, long long rank, long long _off)
272 long long off, data[2];
273 int cp, left = buf_size;
279 cp = left > sizeof(data) ? sizeof(data) : left;