X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flustre_cfg.c;h=87b05a26e605555c0c4f08d10457e8e84d66e219;hb=908aded289da54db4561f5af7a2f1e39c7576150;hp=b973113a4736e667e7009110f0d36c59b2eb75b2;hpb=113303973ec9f8484eb2355a1a6ef3c4c7fd6a56;p=fs%2Flustre-release.git diff --git a/lustre/utils/lustre_cfg.c b/lustre/utils/lustre_cfg.c index b973113..87b05a2 100644 --- a/lustre/utils/lustre_cfg.c +++ b/lustre/utils/lustre_cfg.c @@ -24,12 +24,12 @@ * */ - #include #include #include #include #include +#include #ifndef __KERNEL__ #include @@ -40,7 +40,7 @@ #include #include /* for struct lov_stripe_md */ #include -#include +#include #include #include @@ -460,7 +460,7 @@ int jt_lcfg_param(int argc, char **argv) if (argc >= LUSTRE_CFG_MAX_BUFCOUNT) return CMD_HELP; - lustre_cfg_bufs_reset(&bufs, lcfg_devname); + lustre_cfg_bufs_reset(&bufs, NULL); for (i = 1; i < argc; i++) { lustre_cfg_bufs_set_string(&bufs, i, argv[i]); @@ -478,28 +478,19 @@ int jt_lcfg_param(int argc, char **argv) } /* Param set in config log on MGS */ -/* conf_param key1=value1 [key2=value2...] */ +/* conf_param key1=value1 [key2=value2...] */ int jt_lcfg_mgsparam(int argc, char **argv) { - int i, rc, index_offset = 0; + int i, rc; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; if ((argc >= LUSTRE_CFG_MAX_BUFCOUNT) || (argc <= 1)) return CMD_HELP; - if (!strchr(argv[1], '=')) { - /* Not key=val, assume */ - rc = jt_obd_device(2, argv); - if (rc) - return rc; - index_offset = 1; - } - - lustre_cfg_bufs_reset(&bufs, lcfg_devname); - - for (i = 1; i < (argc - index_offset); i++) { - lustre_cfg_bufs_set_string(&bufs, i, argv[i + index_offset]); + 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. */ @@ -515,4 +506,242 @@ int jt_lcfg_mgsparam(int argc, char **argv) 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, only_path = 0; + char pattern[PATH_MAX]; + char *path, *tmp, *buf; + glob_t glob_info; + + if (argc == 3 && (strcmp(argv[1], "-n") == 0 || strcmp(argv[1], "-N") == 0)) { + path = argv[2]; + if (strcmp(argv[1], "-N") == 0) { + only_path = 1; + show_path = 1; + } + } 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); + if (valuename && only_path) { + printf("%s\n", valuename); + continue; + } + } + + /* 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; +}