/* After removal of a parameter (-d) Lustre will use the default * AT NEXT REBOOT, not immediately. */ int jt_lcfg_mgsparam(int argc, char **argv) { int rc; int del = 0; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; char *buf = NULL; #if LUSTRE_VERSION_CODE >= OBD_OCD_VERSION(2, 7, 53, 0) fprintf(stderr, "warning: 'lctl conf_param' is deprecated, " "use 'lctl set_param -P' instead\n"); #endif /* mgs_setparam processes only lctl buf #1 */ if ((argc > 3) || (argc <= 1)) return CMD_HELP; while ((rc = getopt(argc, argv, "d")) != -1) { switch (rc) { case 'd': del = 1; break; default: return CMD_HELP; } } lustre_cfg_bufs_reset(&bufs, NULL); if (del) { char *ptr; /* for delete, make it "<param>=\0" */ buf = malloc(strlen(argv[optind]) + 2); /* put an '=' on the end in case it doesn't have one */ sprintf(buf, "%s=", argv[optind]); /* then truncate after the first '=' */ ptr = strchr(buf, '='); *(++ptr) = '\0'; lustre_cfg_bufs_set_string(&bufs, 1, buf); } else { lustre_cfg_bufs_set_string(&bufs, 1, argv[optind]); } /* We could put other opcodes here. */ lcfg = lustre_cfg_new(LCFG_PARAM, &bufs); rc = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg); lustre_cfg_free(lcfg); if (buf) free(buf); if (rc < 0) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); } return rc; }
int jt_lcfg_add_conn(int argc, char **argv) { struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; int priority; int rc; if (argc == 2) priority = 0; else if (argc == 3) priority = 1; else return CMD_HELP; if (lcfg_devname == NULL) { fprintf(stderr, "%s: please use 'device name' to set the " "device name for config commands.\n", jt_cmdname(argv[0])); return -EINVAL; } lustre_cfg_bufs_reset(&bufs, lcfg_devname); lustre_cfg_bufs_set_string(&bufs, 1, argv[1]); lcfg = lustre_cfg_new(LCFG_ADD_CONN, &bufs); if (lcfg == NULL) { rc = -ENOMEM; } else { lcfg->lcfg_num = priority; rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg); lustre_cfg_free(lcfg); } if (rc < 0) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); } return rc; }
int jt_lcfg_setparam(int argc, char **argv) { int rc = 0, i; struct param_opts popt; char pattern[PATH_MAX]; char *path = NULL, *value = NULL; rc = setparam_cmdline(argc, argv, &popt); if (rc < 0 || rc >= argc) return CMD_HELP; if (popt.po_params2) /* We can't delete parameters that were * set with old conf_param interface */ return jt_lcfg_mgsparam2(argc, argv, &popt); for (i = rc, rc = 0; i < argc; i++) { int rc2; if ((value = strchr(argv[i], '=')) != NULL) { /* format: set_param a=b */ *value = '\0'; value ++; path = argv[i]; if (*value == '\0') break; } else { /* format: set_param a b */ if (path == NULL) { path = argv[i]; continue; } else { value = argv[i]; } } clean_path(path); lprocfs_param_pattern(argv[0], path, pattern, sizeof(pattern)); rc2 = setparam_display(&popt, pattern, value); path = NULL; value = NULL; if (rc2 < 0 && rc == 0) rc = rc2; } if (path != NULL && (value == NULL || *value == '\0')) fprintf(stderr, "error: %s: setting %s=: %s\n", jt_cmdname(argv[0]), path, strerror(rc = EINVAL)); return rc; }
int jt_lcfg_listparam(int argc, char **argv) { int rc = 0, index, i; struct param_opts popt; char *path; memset(&popt, 0, sizeof(popt)); index = listparam_cmdline(argc, argv, &popt); if (index < 0 || index >= argc) return CMD_HELP; for (i = index; i < argc; i++) { int rc2; path = argv[i]; rc2 = clean_path(&popt, path); if (rc2 < 0) { fprintf(stderr, "error: %s: cleaning '%s': %s\n", jt_cmdname(argv[0]), path, strerror(-rc2)); if (rc == 0) rc = rc2; continue; } rc2 = param_display(&popt, path, NULL, LIST_PARAM); if (rc2 < 0) { fprintf(stderr, "error: %s: listing '%s': %s\n", jt_cmdname(argv[0]), path, strerror(-rc2)); if (rc == 0) rc = rc2; continue; } } return rc; }
int jt_lcfg_setup(int argc, char **argv) { struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; int i; int rc; if (lcfg_devname == NULL) { fprintf(stderr, "%s: please use 'device name' to set the " "device name for config commands.\n", jt_cmdname(argv[0])); return -EINVAL; } lustre_cfg_bufs_reset(&bufs, lcfg_devname); if (argc > 6) return CMD_HELP; for (i = 1; i < argc; i++) { lustre_cfg_bufs_set_string(&bufs, i, argv[i]); } lcfg = lustre_cfg_new(LCFG_SETUP, &bufs); if (lcfg == NULL) { rc = -ENOMEM; } else { rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg); lustre_cfg_free(lcfg); } if (rc < 0) fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); return rc; }
int jt_lcfg_del_mount_option(int argc, char **argv) { int rc; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; if (argc != 2) return CMD_HELP; lustre_cfg_bufs_reset(&bufs, lcfg_devname); /* profile name */ lustre_cfg_bufs_set_string(&bufs, 1, argv[1]); lcfg = lustre_cfg_new(LCFG_DEL_MOUNTOPT, &bufs); rc = lcfg_ioctl(argv[0], OBD_DEV_ID, lcfg); lustre_cfg_free(lcfg); if (rc < 0) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); } return rc; }
/* Param set to single log file, used by all clients and servers. * This should be loaded after the individual config logs. * Called from set param with -P option. */ static int jt_lcfg_mgsparam2(int argc, char **argv, struct param_opts *popt) { int rc, i; int first_param; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; char *buf = NULL; int len; first_param = optind; if (first_param < 0 || first_param >= argc) return CMD_HELP; for (i = first_param, rc = 0; i < argc; i++) { lustre_cfg_bufs_reset(&bufs, NULL); /* This same command would be executed on all nodes, many * of which should fail (silently) because they don't have * that proc file existing locally. There would be no * preprocessing on the MGS to try to figure out which * parameter files to add this to, there would be nodes * processing on the cluster nodes to try to figure out * if they are the intended targets. They will blindly * try to set the parameter, and ENOTFOUND means it wasn't * for them. * Target name "general" means call on all targets. It is * left here in case some filtering will be added in * future. */ lustre_cfg_bufs_set_string(&bufs, 0, "general"); len = strlen(argv[i]); /* put an '=' on the end in case it doesn't have one */ if (popt->po_delete && argv[i][len - 1] != '=') { buf = malloc(len + 1); sprintf(buf, "%s=", argv[i]); } else { buf = argv[i]; } lustre_cfg_bufs_set_string(&bufs, 1, buf); lcfg = lustre_cfg_new(LCFG_SET_PARAM, &bufs); if (IS_ERR(lcfg)) { fprintf(stderr, "error: allocating lcfg for %s: %s\n", jt_cmdname(argv[0]), strerror(PTR_ERR(lcfg))); if (rc == 0) rc = PTR_ERR(lcfg); } else { int rc2 = lcfg_mgs_ioctl(argv[0], OBD_DEV_ID, lcfg); if (rc2 != 0) { fprintf(stderr, "error: executing %s: %s\n", jt_cmdname(argv[0]), strerror(errno)); if (rc == 0) rc = rc2; } lustre_cfg_free(lcfg); } if (buf != argv[i]) free(buf); } return rc; }
int jt_lcfg_setparam(int argc, char **argv) { int rc = 0, index, i; struct param_opts popt; char *path = NULL, *value = NULL; memset(&popt, 0, sizeof(popt)); index = setparam_cmdline(argc, argv, &popt); if (index < 0 || index >= argc) return CMD_HELP; if (popt.po_params2) /* We can't delete parameters that were * set with old conf_param interface */ return jt_lcfg_mgsparam2(argc, argv, &popt); for (i = index; i < argc; i++) { int rc2; path = NULL; value = strchr(argv[i], '='); if (value != NULL) { /* format: set_param a=b */ *value = '\0'; value++; path = argv[i]; if (*value == '\0') { fprintf(stderr, "error: %s: setting %s: no value\n", jt_cmdname(argv[0]), path); if (rc == 0) rc = -EINVAL; continue; } } else { /* format: set_param a b */ path = argv[i]; i++; if (i >= argc) { fprintf(stderr, "error: %s: setting %s: no value\n", jt_cmdname(argv[0]), path); if (rc == 0) rc = -EINVAL; break; } else { value = argv[i]; } } rc2 = clean_path(&popt, path); if (rc2 < 0) { fprintf(stderr, "error: %s: cleaning %s: %s\n", jt_cmdname(argv[0]), path, strerror(-rc2)); if (rc == 0) rc = rc2; continue; } /* A value containing '=' is indicative of user error, e.g.: * lctl set_param param1 param2=value2 * lctl set_param param1=param2=value2 */ if (strchr(value, '=') != NULL) fprintf(stderr, "warning: %s: value '%s' contains '='\n", jt_cmdname(argv[0]), value); rc2 = param_display(&popt, path, value, SET_PARAM); if (rc == 0) rc = rc2; } return rc; }