Whamcloud - gitweb
LU-12191 utils: Make "lctl list_param" read exact path under sysfs tree 52/36852/5
authorSonia Sharma <sharmaso@whamcloud.com>
Tue, 4 Feb 2020 18:34:02 +0000 (13:34 -0500)
committerOleg Drokin <green@whamcloud.com>
Tue, 25 Feb 2020 05:51:17 +0000 (05:51 +0000)
"lctl list_param -R" currently checks for the param_name
in the path and reads the sysfs tree under that. But it can
give erroneous results in the following example -

For path like /sys/fs/lnet/net/o2ib1/ib0, command
"lctl list_param -R" doesn't go down the "net" tree
because it matches "net" with "lnet" and just stop
there.

This patch changes how param_name is checked for
in the path. Like in the above example, instead
of checking for "net", it should check for
"/net". So, this patch adds this change in
param_display() in lustre/utils/lustre_cfg.c

Change-Id: Ieb3ad0d1248eee2192246ff5c4d77a71d87dc446
Signed-off-by: Sonia Sharma <sharmaso@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/36852
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/utils/lustre_cfg.c

index ef7d3d6..a6a783b 100644 (file)
@@ -997,7 +997,7 @@ param_display(struct param_opts *popt, char *pattern, char *value,
 
        for (i = 0; i < paths.gl_pathc; i++) {
                char *param_name = NULL, *tmp;
-               char pathname[PATH_MAX];
+               char pathname[PATH_MAX], param_dir[PATH_MAX+2];
                struct stat st;
                int rc2, j;
 
@@ -1093,11 +1093,13 @@ param_display(struct param_opts *popt, char *pattern, char *value,
                }
 
                /* Use param_name to grab subdirectory tree from full path */
-               tmp = strstr(paths.gl_pathv[i], param_name);
+               snprintf(param_dir, sizeof(param_dir), "/%s", param_name);
+               tmp = strstr(paths.gl_pathv[i], param_dir);
 
                /* cleanup paramname now that we are done with it */
                free(param_name);
                param_name = NULL;
+               memset(&param_dir, '\0', sizeof(param_dir));
 
                /* Shouldn't happen but just in case */
                if (tmp == NULL) {
@@ -1105,6 +1107,7 @@ param_display(struct param_opts *popt, char *pattern, char *value,
                                rc = -EINVAL;
                        continue;
                }
+               tmp++;
 
                rc2 = snprintf(pathname, sizeof(pathname), "%s/*", tmp);
                if (rc2 < 0) {