[lustre-devel] [PATCH 273/622] lustre: obd: update udev event handling

James Simmons jsimmons at infradead.org
Thu Feb 27 13:12:21 PST 2020


Add a timestamp that users have requested so it can be recorded
then a sysfs lustre file changed. Second the PARAM field only
was created with the kobject source and parent name but the
sysfs file could be deeper in the lustre sysfs tree. Add handling
for deeper sysfs tree paths.

WC-bug-id: https://jira.whamcloud.com/browse/LU-8066
Lustre-commit: b0d162390ad6 ("LU-8066 obd: update udev event handling")
Signed-off-by: James Simmons <uja.ornl at yahoo.com>
Reviewed-on: https://review.whamcloud.com/34624
Reviewed-by: Emoly Liu <emoly at whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz at whamcloud.com>
Reviewed-by: Ben Evans <bevans at cray.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 fs/lustre/obdclass/obd_config.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/fs/lustre/obdclass/obd_config.c b/fs/lustre/obdclass/obd_config.c
index 4b1848f..97cb8c1 100644
--- a/fs/lustre/obdclass/obd_config.c
+++ b/fs/lustre/obdclass/obd_config.c
@@ -773,7 +773,7 @@ static int process_param2_config(struct lustre_cfg *lcfg)
 	char *param = lustre_cfg_string(lcfg, 1);
 	struct kobject *kobj = NULL;
 	const char *subsys = param;
-	char *envp[3];
+	char *envp[4];
 	char *value;
 	size_t len;
 	int rc;
@@ -802,7 +802,9 @@ static int process_param2_config(struct lustre_cfg *lcfg)
 	param = strsep(&value, "=");
 	envp[0] = kasprintf(GFP_KERNEL, "PARAM=%s", param);
 	envp[1] = kasprintf(GFP_KERNEL, "SETTING=%s", value);
-	envp[2] = NULL;
+	envp[2] = kasprintf(GFP_KERNEL, "TIME=%lld",
+			    ktime_get_real_seconds());
+	envp[3] = NULL;
 
 	rc = kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
 	for (i = 0; i < ARRAY_SIZE(envp); i++)
@@ -1128,14 +1130,25 @@ ssize_t class_modify_config(struct lustre_cfg *lcfg, const char *prefix,
 		}
 
 		if (!attr) {
-			char *envp[3];
+			char *envp[4], *param, *path;
 
-			envp[0] = kasprintf(GFP_KERNEL, "PARAM=%s.%s.%.*s",
-					    kobject_name(kobj->parent),
-					    kobject_name(kobj),
-					    (int)keylen, key);
+			path = kobject_get_path(kobj, GFP_KERNEL);
+			if (!path)
+				return -EINVAL;
+
+			/* convert sysfs path to uevent format */
+			param = path;
+			while ((param = strchr(param, '/')) != NULL)
+				*param = '.';
+
+			param = strstr(path, "fs.lustre.") + 10;
+
+			envp[0] = kasprintf(GFP_KERNEL, "PARAM=%s.%.*s",
+					    param, (int)keylen, key);
 			envp[1] = kasprintf(GFP_KERNEL, "SETTING=%s", value);
-			envp[2] = NULL;
+			envp[2] = kasprintf(GFP_KERNEL, "TIME=%lld",
+					    ktime_get_real_seconds());
+			envp[3] = NULL;
 
 			if (kobject_uevent_env(kobj, KOBJ_CHANGE, envp)) {
 				CERROR("%s: failed to send uevent %s\n",
@@ -1144,6 +1157,7 @@ ssize_t class_modify_config(struct lustre_cfg *lcfg, const char *prefix,
 
 			for (i = 0; i < ARRAY_SIZE(envp); i++)
 				kfree(envp[i]);
+			kfree(path);
 		} else {
 			count += lustre_attr_store(kobj, attr, value,
 						   strlen(value));
-- 
1.8.3.1



More information about the lustre-devel mailing list