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"
49 extern int class_handle_ioctl(unsigned int cmd, unsigned long arg);
51 static int liblustre_ioctl(int dev_id, unsigned int opc, void *ptr)
57 fprintf(stderr, "Unexpected device id %d\n", dev_id);
62 rc = class_handle_ioctl(opc, (unsigned long)ptr);
69 static char *echo_server_nid = NULL;
70 static char *echo_server_ostname = "obd1";
71 static char *osc_dev_name = "OSC_DEV_NAME";
72 static char *echo_dev_name = "ECHO_CLIENT_DEV_NAME";
74 static int connect_echo_client(void)
76 struct lustre_cfg *lcfg;
77 struct lustre_cfg_bufs bufs;
79 char *peer = "ECHO_PEER_NID";
80 class_uuid_t osc_uuid, echo_uuid;
81 struct obd_uuid osc_uuid_str, echo_uuid_str;
85 ll_generate_random_uuid(osc_uuid);
86 class_uuid_unparse(osc_uuid, &osc_uuid_str);
87 ll_generate_random_uuid(echo_uuid);
88 class_uuid_unparse(echo_uuid, &echo_uuid_str);
90 nid = libcfs_str2nid(echo_server_nid);
91 if (nid == LNET_NID_ANY) {
92 CERROR("Can't parse NID %s\n", echo_server_nid);
97 lustre_cfg_bufs_reset(&bufs, NULL);
98 lustre_cfg_bufs_set_string(&bufs, 1, peer);
99 lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
100 lcfg->lcfg_nid = nid;
101 err = class_process_config(lcfg);
102 lustre_cfg_free(lcfg);
104 CERROR("failed add_uuid\n");
109 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
110 lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_OSC_NAME);
111 lustre_cfg_bufs_set_string(&bufs, 2, osc_uuid_str.uuid);
112 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
113 err = class_process_config(lcfg);
114 lustre_cfg_free(lcfg);
116 CERROR("failed attach osc\n");
121 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
122 lustre_cfg_bufs_set_string(&bufs, 1, echo_server_ostname);
123 lustre_cfg_bufs_set_string(&bufs, 2, peer);
124 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
125 err = class_process_config(lcfg);
126 lustre_cfg_free(lcfg);
128 CERROR("failed setup osc\n");
132 /* attach echo_client */
133 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
134 lustre_cfg_bufs_set_string(&bufs, 1, "echo_client");
135 lustre_cfg_bufs_set_string(&bufs, 2, echo_uuid_str.uuid);
136 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
137 err = class_process_config(lcfg);
138 lustre_cfg_free(lcfg);
140 CERROR("failed attach echo_client\n");
144 /* setup echo_client */
145 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
146 lustre_cfg_bufs_set_string(&bufs, 1, osc_dev_name);
147 lustre_cfg_bufs_set_string(&bufs, 2, NULL);
148 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
149 err = class_process_config(lcfg);
150 lustre_cfg_free(lcfg);
152 CERROR("failed setup echo_client\n");
159 static int disconnect_echo_client(void)
161 struct lustre_cfg_bufs bufs;
162 struct lustre_cfg *lcfg = NULL;
166 /* cleanup echo_client */
167 lustre_cfg_bufs_reset(&bufs, echo_dev_name);
168 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
169 err = class_process_config(lcfg);
171 lustre_cfg_free(lcfg);
172 CERROR("failed cleanup echo_client\n");
176 /* detach echo_client */
177 lcfg->lcfg_command = LCFG_DETACH;
178 err = class_process_config(lcfg);
179 lustre_cfg_free(lcfg);
181 CERROR("failed detach echo_client\n");
186 lustre_cfg_bufs_reset(&bufs, osc_dev_name);
187 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
188 err = class_process_config(lcfg);
190 lustre_cfg_free(lcfg);
191 CERROR("failed cleanup osc device\n");
196 lcfg->lcfg_command = LCFG_DETACH;
197 err = class_process_config(lcfg);
198 lustre_cfg_free(lcfg);
200 CERROR("failed detach osc device\n");
207 static void usage(const char *s)
209 printf("Usage: %s -s ost_host_name [-n ost_name] [-x lctl_options ...]\n", s);
210 printf(" ost_host_name: the host name of echo server\n");
211 printf(" ost_name: ost name, default is \"obd1\"\n");
212 printf(" lctl_options: options to pass to lctl.\n");
213 printf(" (e.g. -x --device 1 test_getattr 10000 -5)\n");
216 extern int time_ptlwait1;
217 extern int time_ptlwait2;
218 extern int time_ptlselect;
220 int main(int argc, char **argv)
223 int xindex = -1; /* index of -x option */
225 /* loop until all options are consumed or we hit
228 while ((c = getopt(argc, argv, "s:n:x:")) != -1 &&
232 echo_server_nid = optarg;
235 echo_server_ostname = optarg;
247 * Only warn with usage() if the -x option isn't specificed
248 * because when using -x this check is not valid.
250 if (optind != argc && xindex == -1)
253 if (!echo_server_nid) {
259 libcfs_subsystem_debug = 0;
261 liblustre_init_random();
263 if (liblustre_init_current(argv[0]) ||
264 init_obdclass() || init_lib_portals() ||
270 echo_client_init()) {
275 rc = connect_echo_client();
279 set_ioc_handler(liblustre_ioctl);
283 * If the -x option is not specified pass no args to lctl
284 * otherwise pass all the options after the "-x" to lctl
286 * HACK: in the case when the -x option is specified
287 * lctl sees argv[0] == "-x" and not the real argv[0] seen
288 * in this function. If that is a problem, a mapping will
289 * have to be done to fix that. However for normal functioning
290 * it seems to be irrelavant
293 rc = lctl_main(1, &argv[0]);
295 rc = lctl_main(argc-xindex+1, &argv[xindex-1]);
297 rc |= disconnect_echo_client();