lustre_cfg.c
来自「lustre 1.6.5 source code」· C语言 代码 · 共 741 行 · 第 1/2 页
C
741 行
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_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); 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_del_conn(int argc, char **argv){ struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; int rc; if (argc != 2) 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); /* connection uuid */ 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 locally, directly on target */int jt_lcfg_param(int argc, char **argv){ int i, rc; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; if (argc >= LUSTRE_CFG_MAX_BUFCOUNT) return CMD_HELP; lustre_cfg_bufs_reset(&bufs, NULL); for (i = 1; i < argc; i++) { lustre_cfg_bufs_set_string(&bufs, i, argv[i]); } lcfg = lustre_cfg_new(LCFG_PARAM, &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 in config log on MGS *//* conf_param key1=value1 [key2=value2...] */int jt_lcfg_mgsparam(int argc, char **argv){ int i, rc; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; if ((argc >= LUSTRE_CFG_MAX_BUFCOUNT) || (argc <= 1)) return CMD_HELP; lustre_cfg_bufs_reset(&bufs, NULL); for (i = 1; i < argc; i++) { lustre_cfg_bufs_set_string(&bufs, i, argv[i]); } /* 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 (rc < 0) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); } return rc;}/* Display the path in the same format as sysctl * For eg. obdfilter.lustre-OST0000.stats */static char *display_name(char *filename){ char *tmp; filename += strlen("/proc/"); if (strncmp(filename, "fs/", strlen("fs/")) == 0) filename += strlen("fs/"); else filename += strlen("sys/"); if (strncmp(filename, "lustre/", strlen("lustre/")) == 0) filename += strlen("lustre/"); /* replace '/' with '.' to match conf_param and sysctl */ tmp = filename; while ((tmp = strchr(tmp, '/')) != NULL) *tmp = '.'; return filename;}/* Find a character in a length limited string */static char *strnchr(const char *p, char c, size_t n){ if (!p) return (0); while (n-- > 0) { if (*p == c) return ((char *)p); p++; } return (0);}int jt_lcfg_getparam(int argc, char **argv){ int fp; int rc = 0, i, show_path = 0; char pattern[PATH_MAX]; char *path, *tmp, *buf; glob_t glob_info; if (argc == 3 && strcmp(argv[1], "-n") == 0) { path = argv[2]; } else if (argc == 2) { show_path = 1; path = argv[1]; } else { return CMD_HELP; } /* If the input is in form Eg. obdfilter.*.stats */ if (strchr(path, '.')) { tmp = path; while (*tmp != '\0') { if (*tmp == '.') *tmp = '/'; tmp ++; } } /* If the entire path is specified as input */ fp = open(path, O_RDONLY); if (fp < 0) snprintf(pattern, PATH_MAX, "/proc/{fs,sys}/{lnet,lustre}/%s", path); else { strcpy(pattern, path); close(fp); } rc = glob(pattern, GLOB_BRACE, NULL, &glob_info); if (rc) { fprintf(stderr, "error : glob %s: %s \n", pattern,strerror(rc)); return rc; } buf = malloc(CFS_PAGE_SIZE); for (i = 0; i < glob_info.gl_pathc; i++) { char *valuename = NULL; memset(buf, 0, CFS_PAGE_SIZE); if (show_path) { char *filename; filename = strdup(glob_info.gl_pathv[i]); valuename = display_name(filename); } /* Write the contents of file to stdout */ fp = open(glob_info.gl_pathv[i], O_RDONLY); if (fp < 0) { fprintf(stderr, "error: %s: opening('%s') failed: %s\n", jt_cmdname(argv[0]), glob_info.gl_pathv[i], strerror(errno)); continue; } do { rc = read(fp, buf, CFS_PAGE_SIZE); if (rc == 0) break; if (rc < 0) { fprintf(stderr, "error: %s: read('%s') " "failed: %s\n", jt_cmdname(argv[0]), glob_info.gl_pathv[i], strerror(errno)); break; } /* Print the output in the format path=value if the * value contains no new line character or cab be * occupied in a line, else print value on new line */ if (valuename && show_path) { int longbuf = strnchr(buf, rc - 1, '\n') != NULL || rc > 60; printf("%s=%s", valuename, longbuf ? "\n" : buf); valuename = NULL; if (!longbuf) continue; fflush(stdout); } rc = write(fileno(stdout), buf, rc); if (rc < 0) { fprintf(stderr, "error: %s: write to stdout " "failed: %s\n", jt_cmdname(argv[0]), strerror(errno)); break; } } while (1); close(fp); } globfree(&glob_info); free(buf); return rc;}int jt_lcfg_setparam(int argc, char **argv){ int rc = 0, i; int fp, show_path = 0; char pattern[PATH_MAX]; char *path, *value, *tmp; glob_t glob_info; path = argv[1]; if (argc == 4 && (strcmp(argv[1], "-n") == 0)) { /* Format: lctl set_param -n param value */ path = argv[2]; value = argv[3]; } else if (argc == 3) { if (strcmp(argv[1], "-n") != 0) { /* Format: lctl set_param param value */ show_path = 1; value = argv[2]; } else if ((value = strchr(argv[2], '=')) != NULL) { /* Format: lctl set_param -n param=value */ path = argv[2]; *value = '\0'; value ++; } else { fprintf(stderr, "error: %s Incorrect arguments." "See Usage\n", jt_cmdname(argv[0])); return CMD_HELP; } } else if (argc == 2 && ((value = strchr(argv[1], '=')) != NULL)) { /* Format: lctl set_param param=value */ show_path = 1; *value = '\0'; value++; } else { fprintf(stderr, "error: %s Incorrect arguments. See Usage\n", jt_cmdname(argv[0])); return CMD_HELP; } /* If the input is in form Eg. obdfilter.*.stats */ if (strchr(path, '.')) { tmp = path; while (*tmp != '\0') { if (*tmp == '.') *tmp = '/'; tmp ++; } } fp = open(path, O_RDONLY); if (fp < 0) snprintf(pattern, PATH_MAX, "/proc/{fs,sys}/{lnet,lustre}/%s", path); else { strcpy(pattern, path); close(fp); } rc = glob(pattern, GLOB_BRACE, NULL, &glob_info); if (rc) { fprintf(stderr, "error : glob %s: %s \n", pattern,strerror(rc)); return rc; } for (i = 0; i < glob_info.gl_pathc; i++) { if (show_path) { char *valuename, *filename; filename = strdup(glob_info.gl_pathv[i]); valuename = display_name(filename); printf("%s=%s\n", valuename, value); } /* Write the new value to the file */ fp = open(glob_info.gl_pathv[i], O_WRONLY); if (fp > 0) { rc = write(fp, value, strlen(value)); if (rc < 0) fprintf(stderr, "error writing to file %s\n", glob_info.gl_pathv[i]); else rc = 0; close(fp); } else { fprintf(stderr, "error: %s: %s opening %s\n", jt_cmdname(argv[0]), strerror(rc = errno), glob_info.gl_pathv[i]); } } globfree(&glob_info); return rc;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?