1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2002 Cluster File Systems, Inc.
5 * Author: Peter J. Braam <braam@clusterfs.com>
6 * Author: Phil Schwan <phil@clusterfs.com>
7 * Author: Andreas Dilger <adilger@clusterfs.com>
8 * Author: Robert Read <rread@clusterfs.com>
10 * This file is part of Lustre, http://www.lustre.org.
12 * Lustre is free software; you can redistribute it and/or
13 * modify it under the terms of version 2 of the GNU General Public
14 * License as published by the Free Software Foundation.
16 * Lustre is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with Lustre; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include <sys/ioctl.h>
34 #include <liblustre.h>
36 #include <lustre_lib.h>
37 #include <lustre_cfg.h>
38 #include <lustre/lustre_idl.h>
39 #include <lustre_dlm.h>
40 #include <obd.h> /* for struct lov_stripe_md */
42 #include <lustre/lustre_build_version.h>
53 #include <lnet/lnetctl.h>
57 static char * lcfg_devname;
59 int lcfg_set_devname(char *name)
64 /* quietly strip the unnecessary '$' */
65 if (*name == '$' || *name == '%')
68 /* We can't translate from dev # to name */
71 lcfg_devname = strdup(name);
79 char * lcfg_get_devname(void)
84 int jt_lcfg_device(int argc, char **argv)
86 return jt_obd_device(argc, argv);
89 int jt_lcfg_attach(int argc, char **argv)
91 struct lustre_cfg_bufs bufs;
92 struct lustre_cfg *lcfg;
98 lustre_cfg_bufs_reset(&bufs, NULL);
100 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
101 lustre_cfg_bufs_set_string(&bufs, 0, argv[2]);
102 lustre_cfg_bufs_set_string(&bufs, 2, argv[3]);
104 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
105 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
106 lustre_cfg_free(lcfg);
108 fprintf(stderr, "error: %s: LCFG_ATTACH %s\n",
109 jt_cmdname(argv[0]), strerror(rc = errno));
110 } else if (argc == 3) {
113 lcfg_set_devname(argv[2]);
114 if (strlen(argv[2]) > 128) {
115 printf("Name too long to set environment\n");
118 snprintf(name, 512, "LUSTRE_DEV_%s", argv[2]);
119 rc = setenv(name, argv[1], 1);
121 printf("error setting env variable %s\n", name);
124 lcfg_set_devname(argv[2]);
130 int jt_lcfg_setup(int argc, char **argv)
132 struct lustre_cfg_bufs bufs;
133 struct lustre_cfg *lcfg;
137 if (lcfg_devname == NULL) {
138 fprintf(stderr, "%s: please use 'device name' to set the "
139 "device name for config commands.\n",
140 jt_cmdname(argv[0]));
144 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
149 for (i = 1; i < argc; i++) {
150 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
153 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
154 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
155 lustre_cfg_free(lcfg);
157 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
158 strerror(rc = errno));
163 int jt_obd_detach(int argc, char **argv)
165 struct lustre_cfg_bufs bufs;
166 struct lustre_cfg *lcfg;
169 if (lcfg_devname == NULL) {
170 fprintf(stderr, "%s: please use 'device name' to set the "
171 "device name for config commands.\n",
172 jt_cmdname(argv[0]));
176 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
181 lcfg = lustre_cfg_new(LCFG_DETACH, &bufs);
182 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
183 lustre_cfg_free(lcfg);
185 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
186 strerror(rc = errno));
191 int jt_obd_cleanup(int argc, char **argv)
193 struct lustre_cfg_bufs bufs;
194 struct lustre_cfg *lcfg;
197 char flags[3] = { 0 };
201 if (lcfg_devname == NULL) {
202 fprintf(stderr, "%s: please use 'device name' to set the "
203 "device name for config commands.\n",
204 jt_cmdname(argv[0]));
208 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
210 if (argc < 1 || argc > 3)
213 /* we are protected from overflowing our buffer by the argc
216 for (n = 1; n < argc; n++) {
217 if (strcmp(argv[n], "force") == 0) {
218 flags[flag_cnt++] = force;
219 } else if (strcmp(argv[n], "failover") == 0) {
220 flags[flag_cnt++] = failover;
222 fprintf(stderr, "unknown option: %s", argv[n]);
228 lustre_cfg_bufs_set_string(&bufs, 1, flags);
231 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
232 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
233 lustre_cfg_free(lcfg);
235 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
236 strerror(rc = errno));
242 int do_add_uuid(char * func, char *uuid, lnet_nid_t nid)
245 struct lustre_cfg_bufs bufs;
246 struct lustre_cfg *lcfg;
248 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
250 lustre_cfg_bufs_set_string(&bufs, 1, uuid);
252 lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
253 lcfg->lcfg_nid = nid;
254 /* Poison NAL -- pre 1.4.6 will LASSERT on 0 NAL, this way it
255 doesn't work without crashing (bz 10130) */
256 lcfg->lcfg_nal = 0x5a;
259 fprintf(stderr, "adding\tnid: %d\tuuid: %s\n",
260 lcfg->lcfg_nid, uuid);
262 rc = lcfg_ioctl(func, OBD_DEV_ID, lcfg);
263 lustre_cfg_free(lcfg);
265 fprintf(stderr, "IOC_PORTAL_ADD_UUID failed: %s\n",
270 printf ("Added uuid %s: %s\n", uuid, libcfs_nid2str(nid));
274 int jt_lcfg_add_uuid(int argc, char **argv)
282 nid = libcfs_str2nid(argv[2]);
283 if (nid == LNET_NID_ANY) {
284 fprintf (stderr, "Can't parse NID %s\n", argv[2]);
288 return do_add_uuid(argv[0], argv[1], nid);
291 int obd_add_uuid(char *uuid, lnet_nid_t nid)
293 return do_add_uuid("obd_add_uuid", uuid, nid);
296 int jt_lcfg_del_uuid(int argc, char **argv)
299 struct lustre_cfg_bufs bufs;
300 struct lustre_cfg *lcfg;
303 fprintf(stderr, "usage: %s <uuid>\n", argv[0]);
307 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
308 if (strcmp (argv[1], "_all_"))
309 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
311 lcfg = lustre_cfg_new(LCFG_DEL_UUID, &bufs);
312 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
313 lustre_cfg_free(lcfg);
315 fprintf(stderr, "IOC_PORTAL_DEL_UUID failed: %s\n",
325 int jt_lcfg_del_mount_option(int argc, char **argv)
328 struct lustre_cfg_bufs bufs;
329 struct lustre_cfg *lcfg;
334 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
337 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
339 lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs);
340 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
341 lustre_cfg_free(lcfg);
343 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
344 strerror(rc = errno));
349 int jt_lcfg_set_timeout(int argc, char **argv)
352 struct lustre_cfg_bufs bufs;
353 struct lustre_cfg *lcfg;
355 fprintf(stderr, "%s has been deprecated. Use conf_param instead.\n"
356 "e.g. conf_param lustre-MDT0000 obd_timeout=50\n",
357 jt_cmdname(argv[0]));
364 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
365 lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
366 lcfg->lcfg_num = atoi(argv[1]);
368 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
369 //rc = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg);
371 lustre_cfg_free(lcfg);
373 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
374 strerror(rc = errno));
381 int jt_lcfg_add_conn(int argc, char **argv)
383 struct lustre_cfg_bufs bufs;
384 struct lustre_cfg *lcfg;
395 if (lcfg_devname == NULL) {
396 fprintf(stderr, "%s: please use 'device name' to set the "
397 "device name for config commands.\n",
398 jt_cmdname(argv[0]));
402 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
404 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
406 lcfg = lustre_cfg_new(LCFG_ADD_CONN, &bufs);
407 lcfg->lcfg_num = priority;
409 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
410 lustre_cfg_free (lcfg);
412 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
413 strerror(rc = errno));
419 int jt_lcfg_del_conn(int argc, char **argv)
421 struct lustre_cfg_bufs bufs;
422 struct lustre_cfg *lcfg;
428 if (lcfg_devname == NULL) {
429 fprintf(stderr, "%s: please use 'device name' to set the "
430 "device name for config commands.\n",
431 jt_cmdname(argv[0]));
435 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
437 /* connection uuid */
438 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
440 lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs);
442 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
443 lustre_cfg_free(lcfg);
445 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
446 strerror(rc = errno));
452 /* Param set locally, directly on target */
453 int jt_lcfg_param(int argc, char **argv)
456 struct lustre_cfg_bufs bufs;
457 struct lustre_cfg *lcfg;
459 if (argc >= LUSTRE_CFG_MAX_BUFCOUNT)
462 lustre_cfg_bufs_reset(&bufs, NULL);
464 for (i = 1; i < argc; i++) {
465 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
468 lcfg = lustre_cfg_new(LCFG_PARAM, &bufs);
470 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
471 lustre_cfg_free(lcfg);
473 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
474 strerror(rc = errno));
479 /* Param set in config log on MGS */
480 /* conf_param key1=value1 [key2=value2...] */
481 int jt_lcfg_mgsparam(int argc, char **argv)
484 struct lustre_cfg_bufs bufs;
485 struct lustre_cfg *lcfg;
487 if ((argc >= LUSTRE_CFG_MAX_BUFCOUNT) || (argc <= 1))
490 lustre_cfg_bufs_reset(&bufs, NULL);
491 for (i = 1; i < argc; i++) {
492 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
495 /* We could put other opcodes here. */
496 lcfg = lustre_cfg_new(LCFG_PARAM, &bufs);
498 rc = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg);
499 lustre_cfg_free(lcfg);
501 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
502 strerror(rc = errno));