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.sun.com/software/products/lustre/docs/GPLv2.pdf
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
27 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
31 * This file is part of Lustre, http://www.lustre.org/
32 * Lustre is a trademark of Sun Microsystems, Inc.
34 * lustre/liblustre/tests/echo_test.c
36 * Lustre Light user test program
39 #include <liblustre.h>
41 #include <obd_class.h>
44 #define LIBLUSTRE_TEST 1
45 #include "../utils/lctl.c"
51 int _sysio_lustre_init(void)
54 * This is an aweful HACK. Basically the problem is on
55 * Catamount, the build system links in liblustre.a to
56 * all the test executables, and at this point its not
57 * clear how to modify the build system to prevent this
58 * from happening. So providing our own call to
59 * _sysio_lustre_init() that does nothing, prevents
60 * liblustre.a from initializing.
62 * Why is liblustre.a initializing a problem anyway. Well
63 * this main() in this module calls init_obdclass(), as
64 * well as the llite_lib.c's _sysio_lustre_init(). Two
65 * calls to init_obdclass() cause an assertion. Secondly
66 * it doesn't even logically make sense, this is module
67 * does not need lustre file system functionality, it's
68 * just the echo_tester.
71 /*lprintf("--> THIS OVERRIDES liblustre.a INITIALIZATION <--\n");*/
78 extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
80 static int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
86 fprintf(stderr, "Unexpected device id %d\n", dev_id);
91 rc = class_handle_ioctl(opc, (unsigned long)ptr);
98 static char *echo_server_nid = NULL;
99 static char *echo_server_ostname = "obd1";
100 static char *osc_dev_name = "OSC_DEV_NAME";
101 static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
103 static int connect_echo_client(void)
105 struct lustre_cfg *lcfg;
106 struct lustre_cfg_bufs bufs;
108 char *peer = "ECHO_PEER_NID";
109 class_uuid_t osc_uuid, echo_uuid;
110 struct obd_uuid osc_uuid_str, echo_uuid_str;
114 ll_generate_random_uuid(osc_uuid);
115 class_uuid_unparse(osc_uuid, &osc_uuid_str);
116 ll_generate_random_uuid(echo_uuid);
117 class_uuid_unparse(echo_uuid, &echo_uuid_str);
119 nid = libcfs_str2nid(echo_server_nid);
120 if (nid == LNET_NID_ANY) {
121 CERROR("Can't parse NID %s\n", echo_server_nid);
126 lustre_cfg_bufs_reset(&bufs, NULL);
127 lustre_cfg_bufs_set_string(&bufs, 1, peer);
128 lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
129 lcfg->lcfg_nid = nid;
130 err = class_process_config(lcfg);
131 lustre_cfg_free(lcfg);
133 CERROR("failed add_uuid\n");
138 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
139 lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_OSC_NAME);
140 lustre_cfg_bufs_set_string(&bufs, 2, osc_uuid_str.uuid);
141 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
142 err = class_process_config(lcfg);
143 lustre_cfg_free(lcfg);
145 CERROR("failed attach osc\n");
150 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
151 lustre_cfg_bufs_set_string(&bufs, 1, echo_server_ostname);
152 lustre_cfg_bufs_set_string(&bufs, 2, peer);
153 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
154 err = class_process_config(lcfg);
155 lustre_cfg_free(lcfg);
157 CERROR("failed setup osc\n");
161 /* attach echo_client */
162 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
163 lustre_cfg_bufs_set_string(&bufs, 1, "echo_client");
164 lustre_cfg_bufs_set_string(&bufs, 2, echo_uuid_str.uuid);
165 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
166 err = class_process_config(lcfg);
167 lustre_cfg_free(lcfg);
169 CERROR("failed attach echo_client\n");
173 /* setup echo_client */
174 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
175 lustre_cfg_bufs_set_string(&bufs, 1, osc_dev_name);
176 lustre_cfg_bufs_set_string(&bufs, 2, NULL);
177 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
178 err = class_process_config(lcfg);
179 lustre_cfg_free(lcfg);
181 CERROR("failed setup echo_client\n");
188 static int disconnect_echo_client(void)
190 struct lustre_cfg_bufs bufs;
191 struct lustre_cfg *lcfg = NULL;
195 /* cleanup echo_client */
196 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
197 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
198 err = class_process_config(lcfg);
200 lustre_cfg_free(lcfg);
201 CERROR("failed cleanup echo_client\n");
205 /* detach echo_client */
206 lcfg->lcfg_command = LCFG_DETACH;
207 err = class_process_config(lcfg);
208 lustre_cfg_free(lcfg);
210 CERROR("failed detach echo_client\n");
215 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
216 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
217 err = class_process_config(lcfg);
219 lustre_cfg_free(lcfg);
220 CERROR("failed cleanup osc device\n");
225 lcfg->lcfg_command = LCFG_DETACH;
226 err = class_process_config(lcfg);
227 lustre_cfg_free(lcfg);
229 CERROR("failed detach osc device\n");
236 static void usage(const char *s)
238 printf("Usage: %s -s ost_host_name [-n ost_name] [-x lctl_options ...]\n", s);
239 printf(" ost_host_name: the host name of echo server\n");
240 printf(" ost_name: ost name, default is \"obd1\"\n");
241 printf(" lctl_options: options to pass to lctl.\n");
242 printf(" (e.g. -x --device 1 test_getattr 10000 -5)\n");
245 extern int time_ptlwait1;
246 extern int time_ptlwait2;
247 extern int time_ptlselect;
249 int main(int argc, char **argv)
252 int xindex = -1; /* index of -x option */
254 /* loop until all options are consumed or we hit
257 while ((c = getopt(argc, argv, "s:n:x:")) != -1 &&
261 echo_server_nid = optarg;
264 echo_server_ostname = optarg;
276 * Only warn with usage() if the -x option isn't specificed
277 * because when using -x this check is not valid.
279 if (optind != argc && xindex == -1)
282 if (!echo_server_nid) {
288 libcfs_subsystem_debug = 0;
290 liblustre_init_random();
292 if (liblustre_init_current(argv[0]) ||
293 init_obdclass() || init_lib_portals() ||
299 echo_client_init()) {
304 rc = connect_echo_client();
308 set_ioc_handler(liblustre_ioctl);
312 * If the -x option is not specified pass no args to lctl
313 * otherwise pass all the options after the "-x" to lctl
315 * HACK: in the case when the -x option is specified
316 * lctl sees argv[0] == "-x" and not the real argv[0] seen
317 * in this function. If that is a problem, a mapping will
318 * have to be done to fix that. However for normal functioning
319 * it seems to be irrelavant
322 rc = lctl_main(1, &argv[0]);
324 rc = lctl_main(argc-xindex+1, &argv[xindex-1]);
326 rc |= disconnect_echo_client();