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 <linux/lustre_lib.h>
37 #include <linux/lustre_cfg.h>
38 #include <linux/lustre_idl.h>
39 #include <linux/lustre_dlm.h>
40 #include <linux/obd.h> /* for struct lov_stripe_md */
41 #include <linux/lustre_build_version.h>
52 #include <portals/ptlctl.h>
56 static char *lcfg_devname;
58 void lcfg_set_devname(char *name)
62 lcfg_devname = strdup(name);
66 int jt_lcfg_device(int argc, char **argv)
71 printf("current device is %s\n", lcfg_devname? : "not set");
73 } else if (argc != 2) {
79 /* quietly strip the unnecessary '$' */
83 lcfg_set_devname(name);
89 int jt_lcfg_newdev(int argc, char **argv)
94 int jt_lcfg_attach(int argc, char **argv)
96 struct lustre_cfg_bufs bufs;
97 struct lustre_cfg *lcfg;
100 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
102 if (argc != 2 && argc != 3 && argc != 4)
105 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
107 lustre_cfg_bufs_set_string(&bufs, 0, argv[2]);
109 fprintf(stderr, "error: %s: LCFG_ATTACH requires a name\n",
110 jt_cmdname(argv[0]));
115 lustre_cfg_bufs_set_string(&bufs, 2, argv[3]);
117 lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
118 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
119 lustre_cfg_free(lcfg);
121 fprintf(stderr, "error: %s: LCFG_ATTACH %s\n",
122 jt_cmdname(argv[0]), strerror(rc = errno));
123 } else if (argc == 3) {
126 lcfg_set_devname(argv[2]);
127 if (strlen(argv[2]) > 128) {
128 printf("Name too long to set environment\n");
131 snprintf(name, 512, "LUSTRE_DEV_%s", argv[2]);
132 rc = setenv(name, argv[1], 1);
134 printf("error setting env variable %s\n", name);
137 lcfg_set_devname(argv[2]);
143 int jt_lcfg_setup(int argc, char **argv)
145 struct lustre_cfg_bufs bufs;
146 struct lustre_cfg *lcfg;
149 if (lcfg_devname == NULL) {
150 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
151 "device name for config commands.\n",
152 jt_cmdname(argv[0]));
156 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
161 for (i = 1; i < argc; i++) {
162 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
165 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
166 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
167 lustre_cfg_free(lcfg);
169 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
170 strerror(rc = errno));
175 int jt_obd_detach(int argc, char **argv)
177 struct lustre_cfg_bufs bufs;
178 struct lustre_cfg *lcfg;
181 if (lcfg_devname == NULL) {
182 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
183 "device name for config commands.\n",
184 jt_cmdname(argv[0]));
187 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
192 lcfg = lustre_cfg_new(LCFG_DETACH, &bufs);
193 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
194 lustre_cfg_free(lcfg);
197 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
198 strerror(rc = errno));
202 int jt_obd_cleanup(int argc, char **argv)
204 struct lustre_cfg_bufs bufs;
205 struct lustre_cfg *lcfg;
214 if (lcfg_devname == NULL) {
215 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
216 "device name for config commands.\n",
217 jt_cmdname(argv[0]));
221 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
223 if (argc < 1 || argc > 3)
226 /* we are protected from overflowing our buffer by the argc
229 for (n = 1; n < argc; n++) {
230 if (strcmp(argv[n], "force") == 0) {
231 flags[flag_cnt++] = force;
232 } else if (strcmp(argv[n], "failover") == 0) {
233 flags[flag_cnt++] = failover;
235 fprintf(stderr, "unknown option: %s", argv[n]);
241 lustre_cfg_bufs_set_string(&bufs, 1, flags);
244 lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
245 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
246 lustre_cfg_free(lcfg);
248 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
249 strerror(rc = errno));
255 int do_add_uuid(char * func, char *uuid, ptl_nid_t nid, int nal)
259 struct lustre_cfg_bufs bufs;
260 struct lustre_cfg *lcfg;
262 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
264 lustre_cfg_bufs_set_string(&bufs, 1, uuid);
266 lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
267 lcfg->lcfg_nid = nid;
268 lcfg->lcfg_nal = nal;
270 rc = lcfg_ioctl(func, OBD_DEV_ID, lcfg);
271 lustre_cfg_free(lcfg);
273 fprintf(stderr, "IOC_PORTAL_ADD_UUID failed: %s\n",
278 printf ("Added uuid %s: %s\n", uuid, ptl_nid2str (tmp, nid));
283 int jt_lcfg_add_uuid(int argc, char **argv)
292 if (ptl_parse_nid (&nid, argv[2]) != 0) {
293 fprintf (stderr, "Can't parse NID %s\n", argv[2]);
297 nal = ptl_name2nal(argv[3]);
300 fprintf (stderr, "Can't parse NAL %s\n", argv[3]);
304 return do_add_uuid(argv[0], argv[1], nid, nal);
307 int obd_add_uuid(char *uuid, ptl_nid_t nid, int nal)
309 return do_add_uuid("obd_add_uuid", uuid, nid, nal);
312 int jt_lcfg_del_uuid(int argc, char **argv)
315 struct lustre_cfg_bufs bufs;
316 struct lustre_cfg *lcfg;
319 fprintf(stderr, "usage: %s <uuid>\n", argv[0]);
323 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
324 if (strcmp (argv[1], "_all_"))
325 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
327 lcfg = lustre_cfg_new(LCFG_DEL_UUID, &bufs);
328 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
329 lustre_cfg_free(lcfg);
331 fprintf(stderr, "IOC_PORTAL_DEL_UUID failed: %s\n",
338 int jt_lcfg_lov_setup(int argc, char **argv)
340 struct lustre_cfg_bufs bufs;
341 struct lustre_cfg *lcfg;
342 struct lov_desc desc;
346 /* argv: lov_setup <LOV uuid> <stripe count> <stripe size>
347 * <stripe offset> <pattern> [ <max tgt index> ]
352 if (strlen(argv[1]) > sizeof(desc.ld_uuid) - 1) {
354 "error: %s: LOV uuid '%s' longer than "LPSZ" chars\n",
355 jt_cmdname(argv[0]), argv[1], sizeof(desc.ld_uuid) - 1);
359 memset(&desc, 0, sizeof(desc));
360 obd_str2uuid(&desc.ld_uuid, argv[1]);
361 desc.ld_default_stripe_count = strtoul(argv[2], &end, 0);
363 fprintf(stderr, "error: %s: bad default stripe count '%s'\n",
364 jt_cmdname(argv[0]), argv[2]);
368 desc.ld_default_stripe_size = strtoull(argv[3], &end, 0);
370 fprintf(stderr, "error: %s: bad default stripe size '%s'\n",
371 jt_cmdname(argv[0]), argv[3]);
374 if (desc.ld_default_stripe_size < 4096) {
376 "error: %s: default stripe size "LPU64" too small\n",
377 jt_cmdname(argv[0]), desc.ld_default_stripe_size);
379 } else if ((long)desc.ld_default_stripe_size <
380 desc.ld_default_stripe_size) {
382 "error: %s: default stripe size "LPU64" too large\n",
383 jt_cmdname(argv[0]), desc.ld_default_stripe_size);
386 desc.ld_default_stripe_offset = strtoull(argv[4], &end, 0);
388 fprintf(stderr, "error: %s: bad default stripe offset '%s'\n",
389 jt_cmdname(argv[0]), argv[4]);
392 desc.ld_pattern = strtoul(argv[5], &end, 0);
394 fprintf(stderr, "error: %s: bad stripe pattern '%s'\n",
395 jt_cmdname(argv[0]), argv[5]);
400 desc.ld_tgt_count = argc - 6;
401 if (desc.ld_default_stripe_count > desc.ld_tgt_count) {
403 "error: %s: default stripe count %u > "
404 "OST count %u\n", jt_cmdname(argv[0]),
405 desc.ld_default_stripe_count,
411 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
412 lustre_cfg_bufs_set(&bufs, 1, &desc, sizeof(desc));
414 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
415 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
416 lustre_cfg_free(lcfg);
418 fprintf(stderr, "error: %s: ioctl error: %s\n",
419 jt_cmdname(argv[0]), strerror(rc = errno));
423 int jt_lcfg_lmv_setup(int argc, char **argv)
425 struct lustre_cfg_bufs bufs;
426 struct lustre_cfg *lcfg;
427 struct lmv_desc desc;
428 struct obd_uuid *uuidarray, *ptr;
431 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
435 if (strlen(argv[1]) > sizeof(desc.ld_uuid) - 1) {
437 "error: %s: LMV uuid '%s' longer than "LPSZ" chars\n",
438 jt_cmdname(argv[0]), argv[1], sizeof(desc.ld_uuid) - 1);
442 memset(&desc, 0, sizeof(desc));
443 obd_str2uuid(&desc.ld_uuid, argv[1]);
444 desc.ld_tgt_count = argc - 2;
445 printf("LMV: %d uuids:\n", desc.ld_tgt_count);
447 /* NOTE: it is possible to overwrite the default striping parameters,
448 * but EXTREME care must be taken when saving the OST UUID list.
449 * It must be EXACTLY the same, or have only additions at the
450 * end of the list, or only overwrite individual OST entries
451 * that are restored from backups of the previous OST.
453 uuidarray = calloc(desc.ld_tgt_count, sizeof(*uuidarray));
455 fprintf(stderr, "error: %s: no memory for %d UUIDs\n",
456 jt_cmdname(argv[0]), desc.ld_tgt_count);
460 for (i = 2, ptr = uuidarray; i < argc; i++, ptr++) {
461 if (strlen(argv[i]) >= sizeof(*ptr)) {
462 fprintf(stderr, "error: %s: arg %d (%s) too long\n",
463 jt_cmdname(argv[0]), i, argv[i]);
467 printf(" %s\n", argv[i]);
468 strcpy((char *)ptr, argv[i]);
471 lustre_cfg_bufs_set(&bufs, 1, &desc, sizeof(desc));
472 lustre_cfg_bufs_set(&bufs, 2, (char*)uuidarray,
473 desc.ld_tgt_count * sizeof(*uuidarray));
474 lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
475 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
476 lustre_cfg_free(lcfg);
479 fprintf(stderr, "error: %s: ioctl error: %s\n",
480 jt_cmdname(argv[0]), strerror(rc = errno));
485 int jt_lcfg_lov_modify_tgts(int argc, char **argv)
487 struct lustre_cfg_bufs bufs;
488 struct lustre_cfg *lcfg;
495 /* argv: lov_modify_tgts <op> <LOV name> <OBD uuid> <index> <gen> */
499 if (!strncmp(argv[1], "add", 4)) {
500 cmd = LCFG_LOV_ADD_OBD;
501 } else if (!strncmp(argv[1], "del", 4)) {
502 cmd = LCFG_LOV_DEL_OBD;
504 fprintf(stderr, "error: %s: bad operation '%s'\n",
505 jt_cmdname(argv[0]), argv[1]);
509 lustre_cfg_bufs_reset(&bufs, argv[2]);
512 if (((index = strlen(argv[3]) + 1)) > sizeof(struct obd_uuid)) {
514 "error: %s: OBD uuid '%s' longer than "LPSZ" chars\n",
515 jt_cmdname(argv[0]), argv[3],
516 sizeof(struct obd_uuid) - 1);
519 lustre_cfg_bufs_set(&bufs, 1, argv[3], index);
521 index = strtoul(argv[4], &end, 0);
523 fprintf(stderr, "error: %s: bad OBD index '%s'\n",
524 jt_cmdname(argv[0]), argv[4]);
527 lustre_cfg_bufs_set(&bufs, 2, argv[4], strlen(argv[4]));
529 gen = strtoul(argv[5], &end, 0);
531 fprintf(stderr, "error: %s: bad OBD generation '%s'\n",
532 jt_cmdname(argv[0]), argv[5]);
535 lustre_cfg_bufs_set(&bufs, 3, argv[5], strlen(argv[5]));
537 lcfg = lustre_cfg_new(cmd, &bufs);
538 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
539 lustre_cfg_free(lcfg);
541 fprintf(stderr, "error: %s: ioctl error: %s\n",
542 jt_cmdname(argv[0]), strerror(rc = errno));
546 int jt_lcfg_mount_option(int argc, char **argv)
549 struct lustre_cfg_bufs bufs;
550 struct lustre_cfg *lcfg;
553 if (argc < 3 || argc > 4)
556 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
558 for (i = 1; i < argc; i++)
559 lustre_cfg_bufs_set_string(&bufs, i, argv[i]);
561 lcfg = lustre_cfg_new(LCFG_MOUNTOPT, &bufs);
562 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
563 lustre_cfg_free(lcfg);
565 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
566 strerror(rc = errno));
571 int jt_lcfg_del_mount_option(int argc, char **argv)
574 struct lustre_cfg_bufs bufs;
575 struct lustre_cfg *lcfg;
580 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
583 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
585 lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs);
586 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
587 lustre_cfg_free(lcfg);
589 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
590 strerror(rc = errno));
595 int jt_lcfg_set_timeout(int argc, char **argv)
598 struct lustre_cfg_bufs bufs;
599 struct lustre_cfg *lcfg;
604 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
605 lcfg = lustre_cfg_new(LCFG_SET_TIMEOUT, &bufs);
606 lcfg->lcfg_num = atoi(argv[1]);
608 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
609 lustre_cfg_free(lcfg);
611 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
612 strerror(rc = errno));
618 int jt_lcfg_set_lustre_upcall(int argc, char **argv)
621 struct lustre_cfg_bufs bufs;
622 struct lustre_cfg *lcfg;
627 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
630 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
632 lcfg = lustre_cfg_new(LCFG_SET_UPCALL, &bufs);
633 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
634 lustre_cfg_free(lcfg);
636 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
637 strerror(rc = errno));
642 int jt_lcfg_add_conn(int argc, char **argv)
644 struct lustre_cfg_bufs bufs;
645 struct lustre_cfg *lcfg;
656 if (lcfg_devname == NULL) {
657 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
658 "device name for config commands.\n",
659 jt_cmdname(argv[0]));
663 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
665 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
667 lcfg = lustre_cfg_new(LCFG_ADD_CONN, &bufs);
668 lcfg->lcfg_num = priority;
670 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
671 lustre_cfg_free (lcfg);
673 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
674 strerror(rc = errno));
679 int jt_lcfg_del_conn(int argc, char **argv)
681 struct lustre_cfg_bufs bufs;
682 struct lustre_cfg *lcfg;
688 if (lcfg_devname == NULL) {
689 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
690 "device name for config commands.\n",
691 jt_cmdname(argv[0]));
695 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
697 /* connection uuid */
698 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
700 lcfg = lustre_cfg_new(LCFG_DEL_CONN, &bufs);
702 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
703 lustre_cfg_free(lcfg);
705 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
706 strerror(rc = errno));
712 int jt_lcfg_set_security(int argc, char **argv)
714 struct lustre_cfg_bufs bufs;
715 struct lustre_cfg *lcfg;
721 if (lcfg_devname == NULL) {
722 fprintf(stderr, "%s: please use 'cfg_device name' to set the "
723 "device name for config commands.\n",
724 jt_cmdname(argv[0]));
728 lustre_cfg_bufs_reset(&bufs, lcfg_devname);
730 /* currently only used to set on mds */
731 if (strcmp(argv[1], "mds_sec") &&
732 strcmp(argv[1], "oss_sec") &&
733 strcmp(argv[1], "deny_sec")) {
734 fprintf(stderr, "%s: invalid security key %s\n",
735 jt_cmdname(argv[0]), argv[1]);
738 if (strcmp(argv[2], "null") &&
739 strcmp(argv[2], "krb5i") &&
740 strcmp(argv[2], "krb5p")) {
741 fprintf(stderr, "%s: invalid security value %s\n",
742 jt_cmdname(argv[0]), argv[2]);
746 /* connection uuid */
747 lustre_cfg_bufs_set_string(&bufs, 1, argv[1]);
748 lustre_cfg_bufs_set_string(&bufs, 2, argv[2]);
749 lcfg = lustre_cfg_new(LCFG_SET_SECURITY, &bufs);
751 rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg);
752 lustre_cfg_free(lcfg);
754 fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]),
755 strerror(rc = errno));