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.
29 #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 <linux/lustre_build_version.h>
53 #include <lnet/lnetctl.h>
57 static char * lcfg_devname;
59 void lcfg_set_devname(char *name)
63 lcfg_devname = strdup(name);
67 int jt_lcfg_device(int argc, char **argv)
72 printf("current device is %s\n", lcfg_devname? : "not set");
74 } else if (argc != 2) {
80 /* quietly strip the unnecessary '$' */
84 lcfg_set_devname(name);
90 int jt_lcfg_newdev(int argc, char **argv)
95 int jt_lcfg_attach(int argc, char **argv)
97 struct lustre_cfg_bufs bufs;
98 struct lustre_cfg *lcfg;
104 lustre_cfg_bufs_reset(&bufs, NULL);
106 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
107 lustre_cfg_bufs_set_string(&bufs, 0, argv[2]);
108 lustre_cfg_bufs_set_string(&bufs, 2, argv[3]);
110 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
111 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
112 lustre_cfg_free(lcfg);
114 fprintf(stderr, "error: %s: LCFG_ATTACH %s\n",
115 jt_cmdname(argv[0]), strerror(rc = errno));
116 } else if (argc == 3) {
119 lcfg_set_devname(argv[2]);
120 if (strlen(argv[2]) > 128) {
121 printf("Name too long to set environment\n");
124 snprintf(name, 512, "LUSTRE_DEV_%s", argv[2]);
125 rc = setenv(name, argv[1], 1);
127 printf("error setting env variable %s\n", name);
130 lcfg_set_devname(argv[2]);
136 int jt_lcfg_setup(int argc, char **argv)
138 struct lustre_cfg_bufs bufs;
139 struct lustre_cfg *lcfg;
143 if (lcfg_devname == NULL) {
144 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
145 "device name for config commands.\n",
146 jt_cmdname(argv[0]));
150 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
155 for (i = 1; i < argc; i++) {
156 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
159 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
160 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
161 lustre_cfg_free(lcfg);
163 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
164 strerror(rc = errno));
169 int jt_obd_detach(int argc, char **argv)
171 struct lustre_cfg_bufs bufs;
172 struct lustre_cfg *lcfg;
175 if (lcfg_devname == NULL) {
176 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
177 "device name for config commands.\n",
178 jt_cmdname(argv[0]));
182 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
187 lcfg = lustre_cfg_new(LCFG_DETACH, &bufs);
188 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
189 lustre_cfg_free(lcfg);
191 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
192 strerror(rc = errno));
197 int jt_obd_cleanup(int argc, char **argv)
199 struct lustre_cfg_bufs bufs;
200 struct lustre_cfg *lcfg;
203 char flags[3] = { 0 };
207 if (lcfg_devname == NULL) {
208 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
209 "device name for config commands.\n",
210 jt_cmdname(argv[0]));
214 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
216 if (argc < 1 || argc > 3)
219 /* we are protected from overflowing our buffer by the argc
222 for (n = 1; n < argc; n++) {
223 if (strcmp(argv[n], "force") == 0) {
224 flags[flag_cnt++] = force;
225 } else if (strcmp(argv[n], "failover") == 0) {
226 flags[flag_cnt++] = failover;
228 fprintf(stderr, "unknown option: %s", argv[n]);
234 lustre_cfg_bufs_set_string(&bufs, 1, flags);
237 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
238 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
239 lustre_cfg_free(lcfg);
241 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
242 strerror(rc = errno));
248 int do_add_uuid(char * func, char *uuid, lnet_nid_t nid)
251 struct lustre_cfg_bufs bufs;
252 struct lustre_cfg *lcfg;
254 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
256 lustre_cfg_bufs_set_string(&bufs, 1, uuid);
258 lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
259 lcfg->lcfg_nid = nid;
260 /* Poison NAL -- pre 1.4.6 will LASSERT on 0 NAL, this way it
261 doesn't work without crashing (bz 10130) */
262 lcfg->lcfg_nal = 0x5a;
265 fprintf(stderr, "adding\tnid: %d\tuuid: %s\n",
266 lcfg->lcfg_nid, uuid);
268 rc = lcfg_ioctl(func, OBD_DEV_ID, lcfg);
269 lustre_cfg_free(lcfg);
271 fprintf(stderr, "IOC_PORTAL_ADD_UUID failed: %s\n",
276 printf ("Added uuid %s: %s\n", uuid, libcfs_nid2str(nid));
280 int jt_lcfg_add_uuid(int argc, char **argv)
288 nid = libcfs_str2nid(argv[2]);
289 if (nid == LNET_NID_ANY) {
290 fprintf (stderr, "Can't parse NID %s\n", argv[2]);
294 return do_add_uuid(argv[0], argv[1], nid);
297 int obd_add_uuid(char *uuid, lnet_nid_t nid)
299 return do_add_uuid("obd_add_uuid", uuid, nid);
302 int jt_lcfg_del_uuid(int argc, char **argv)
305 struct lustre_cfg_bufs bufs;
306 struct lustre_cfg *lcfg;
309 fprintf(stderr, "usage: %s <uuid>\n", argv[0]);
313 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
314 if (strcmp (argv[1], "_all_"))
315 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
317 lcfg = lustre_cfg_new(LCFG_DEL_UUID, &bufs);
318 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
319 lustre_cfg_free(lcfg);
321 fprintf(stderr, "IOC_PORTAL_DEL_UUID failed: %s\n",
328 int jt_lcfg_lov_setup(int argc, char **argv)
330 struct lustre_cfg_bufs bufs;
331 struct lustre_cfg *lcfg;
332 struct lov_desc desc;
336 /* argv: lov_setup <LOV uuid> <stripe count> <stripe size>
337 * <stripe offset> <pattern> [ <max tgt index> ]
339 if (argc < 6 || argc > 7)
342 if (strlen(argv[1]) > sizeof(desc.ld_uuid) - 1) {
344 "error: %s: LOV uuid '%s' longer than "LPSZ" chars\n",
345 jt_cmdname(argv[0]), argv[1], sizeof(desc.ld_uuid) - 1);
349 memset(&desc, 0, sizeof(desc));
350 obd_str2uuid(&desc.ld_uuid, argv[1]);
351 desc.ld_tgt_count = 0;
352 desc.ld_magic = LOV_DESC_MAGIC;
353 desc.ld_default_stripe_count = strtoul(argv[2], &end, 0);
355 fprintf(stderr, "error: %s: bad default stripe count '%s'\n",
356 jt_cmdname(argv[0]), argv[2]);
360 desc.ld_default_stripe_size = strtoull(argv[3], &end, 0);
362 fprintf(stderr, "error: %s: bad default stripe size '%s'\n",
363 jt_cmdname(argv[0]), argv[3]);
366 if (desc.ld_default_stripe_size < 4096) {
368 "error: %s: default stripe size "LPU64" smaller than "
370 jt_cmdname(argv[0]), desc.ld_default_stripe_size,
371 LOV_MIN_STRIPE_SIZE);
373 } else if ((long)desc.ld_default_stripe_size <
374 desc.ld_default_stripe_size) {
376 "error: %s: default stripe size "LPU64" too large\n",
377 jt_cmdname(argv[0]), desc.ld_default_stripe_size);
380 desc.ld_default_stripe_offset = strtoull(argv[4], &end, 0);
382 fprintf(stderr, "error: %s: bad default stripe offset '%s'\n",
383 jt_cmdname(argv[0]), argv[4]);
386 desc.ld_pattern = strtoul(argv[5], &end, 0);
388 fprintf(stderr, "error: %s: bad stripe pattern '%s'\n",
389 jt_cmdname(argv[0]), argv[5]);
392 desc.ld_qos_threshold = QOS_DEFAULT_THRESHOLD;
393 desc.ld_qos_maxage = QOS_DEFAULT_MAXAGE;
396 desc.ld_tgt_count = strtoul(argv[6], &end, 0);
398 fprintf(stderr, "error: %s: bad target count '%s'\n",
399 jt_cmdname(argv[0]), argv[6]);
402 if (desc.ld_default_stripe_count > desc.ld_tgt_count) {
404 "error: %s: default stripe count %u > "
405 "OST count %u\n", jt_cmdname(argv[0]),
406 desc.ld_default_stripe_count,
412 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
413 lustre_cfg_bufs_set(&bufs, 1, &desc, sizeof(desc));
415 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
416 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
417 lustre_cfg_free(lcfg);
419 fprintf(stderr, "error: %s: ioctl error: %s\n",
420 jt_cmdname(argv[0]), strerror(rc = errno));
424 int jt_lcfg_lov_modify_tgts(int argc, char **argv)
426 struct lustre_cfg_bufs bufs;
427 struct lustre_cfg *lcfg;
434 /* argv: lov_modify_tgts <op> <LOV name> <OBD uuid> <index> <gen> */
438 if (!strncmp(argv[1], "add", 4)) {
439 cmd = LCFG_LOV_ADD_OBD;
440 } else if (!strncmp(argv[1], "del", 4)) {
441 cmd = LCFG_LOV_DEL_OBD;
443 fprintf(stderr, "error: %s: bad operation '%s'\n",
444 jt_cmdname(argv[0]), argv[1]);
448 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
450 if (((index = strlen(argv[3]) + 1)) > sizeof(struct obd_uuid)) {
452 "error: %s: OBD uuid '%s' longer than "LPSZ" chars\n",
453 jt_cmdname(argv[0]), argv[3],
454 sizeof(struct obd_uuid) - 1);
457 lustre_cfg_bufs_set(&bufs, 1, argv[3], index);
459 index = strtoul(argv[4], &end, 0);
461 fprintf(stderr, "error: %s: bad OBD index '%s'\n",
462 jt_cmdname(argv[0]), argv[4]);
465 lustre_cfg_bufs_set(&bufs, 2, argv[4], strlen(argv[4]));
467 gen = strtoul(argv[5], &end, 0);
469 fprintf(stderr, "error: %s: bad OBD generation '%s'\n",
470 jt_cmdname(argv[0]), argv[5]);
473 lustre_cfg_bufs_set(&bufs, 3, argv[5], strlen(argv[5]));
475 lcfg = lustre_cfg_new(cmd, &bufs);
476 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
477 lustre_cfg_free(lcfg);
479 fprintf(stderr, "error: %s: ioctl error: %s\n",
480 jt_cmdname(argv[0]), strerror(rc = errno));
487 int jt_lcfg_mount_option(int argc, char **argv)
490 struct lustre_cfg_bufs bufs;
491 struct lustre_cfg *lcfg;
494 if (argc < 3 || argc > 4)
497 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
499 for (i = 1; i < argc; i++)
500 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
502 lcfg = lustre_cfg_new(LCFG_MOUNTOPT, &bufs);
503 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
504 lustre_cfg_free(lcfg);
506 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
507 strerror(rc = errno));
512 int jt_lcfg_del_mount_option(int argc, char **argv)
515 struct lustre_cfg_bufs bufs;
516 struct lustre_cfg *lcfg;
521 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
524 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
526 lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs);
527 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
528 lustre_cfg_free(lcfg);
530 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
531 strerror(rc = errno));
536 int jt_lcfg_set_timeout(int argc, char **argv)
539 struct lustre_cfg_bufs bufs;
540 struct lustre_cfg *lcfg;
542 fprintf(stderr, "%s has been deprecated. Use conf_param instead.\n"
543 "e.g. conf_param lustre-MDT0000 obd_timeout=50\n",
544 jt_cmdname(argv[0]));
551 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
552 lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
553 lcfg->lcfg_num = atoi(argv[1]);
555 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
556 //rc = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg);
558 lustre_cfg_free(lcfg);
560 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
561 strerror(rc = errno));
567 int jt_lcfg_set_lustre_upcall(int argc, char **argv)
570 struct lustre_cfg_bufs bufs;
571 struct lustre_cfg *lcfg;
576 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
579 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
581 lcfg = lustre_cfg_new(LCFG_SET_UPCALL, &bufs);
582 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
583 lustre_cfg_free(lcfg);
585 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
586 strerror(rc = errno));
591 int jt_lcfg_add_conn(int argc, char **argv)
593 struct lustre_cfg_bufs bufs;
594 struct lustre_cfg *lcfg;
605 if (lcfg_devname == NULL) {
606 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
607 "device name for config commands.\n",
608 jt_cmdname(argv[0]));
612 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
614 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
616 lcfg = lustre_cfg_new(LCFG_ADD_CONN, &bufs);
617 lcfg->lcfg_num = priority;
619 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
620 lustre_cfg_free (lcfg);
622 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
623 strerror(rc = errno));
629 int jt_lcfg_del_conn(int argc, char **argv)
631 struct lustre_cfg_bufs bufs;
632 struct lustre_cfg *lcfg;
638 if (lcfg_devname == NULL) {
639 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
640 "device name for config commands.\n",
641 jt_cmdname(argv[0]));
645 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
647 /* connection uuid */
648 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
650 lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs);
652 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
653 lustre_cfg_free(lcfg);
655 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
656 strerror(rc = errno));
662 /* Param set locally, directly on target */
663 int jt_lcfg_param(int argc, char **argv)
666 struct lustre_cfg_bufs bufs;
667 struct lustre_cfg *lcfg;
669 if (argc >= LUSTRE_CFG_MAX_BUFCOUNT)
672 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
674 for (i = 1; i < argc; i++) {
675 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
678 lcfg = lustre_cfg_new(LCFG_PARAM, &bufs);
680 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
681 lustre_cfg_free(lcfg);
683 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
684 strerror(rc = errno));
689 /* Param set in config log on MGS */
690 /* conf_param <cfg_device> key1=value1 [key2=value2...] */
691 int jt_lcfg_mgsparam(int argc, char **argv)
693 int i, rc, index_offset = 0;
694 struct lustre_cfg_bufs bufs;
695 struct lustre_cfg *lcfg;
697 if ((argc >= LUSTRE_CFG_MAX_BUFCOUNT) || (argc <= 1))
700 if (!strchr(argv[1], '=')) {
701 /* Not key=val, assume <cfg_device> */
702 rc = jt_lcfg_device(2, argv);
708 if (lcfg_devname == NULL) {
709 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
710 "device name for config commands.\n",
711 jt_cmdname(argv[0]));
715 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
717 for (i = 1; i < (argc - index_offset); i++) {
718 lustre_cfg_bufs_set_string(&bufs, i, argv[i + index_offset]);
721 /* We could put other opcodes here. */
722 lcfg = lustre_cfg_new(LCFG_PARAM, &bufs);
724 rc = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg);
725 lustre_cfg_free(lcfg);
727 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
728 strerror(rc = errno));