Whamcloud - gitweb
LU-12191 utils: Make "lctl list_param" read exact path under sysfs tree
authorSonia Sharma <sharmaso@whamcloud.com>
Tue, 16 Apr 2019 11:54:33 +0000 (04:54 -0700)
committerSonia Sharma <sharmaso@whamcloud.com>
Wed, 29 May 2019 07:08:15 +0000 (03:08 -0400)
"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" doesnt 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 checkign 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/34693
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Tested-by: Jenkins
Reviewed-by: Amir Shehata <ashehata@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/utils/lustre_cfg.c

index ef7d3d6..223ed51 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,14 @@ 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);
+               tmp++;
 
                /* 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) {