From b0d162390ad63d9dff12295a19022f3152592f7c Mon Sep 17 00:00:00 2001 From: James Simmons Date: Tue, 9 Apr 2019 13:04:30 -0400 Subject: [PATCH] LU-8066 obd: update udev event handling 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. Change-Id: I46d4861addd16a6d5b6c28ad8bc2ce446e554d62 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/34624 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Emoly Liu Reviewed-by: Alex Zhuravlev Reviewed-by: Ben Evans Reviewed-by: Oleg Drokin --- lustre/obdclass/obd_config.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/lustre/obdclass/obd_config.c b/lustre/obdclass/obd_config.c index de558e7..3ee0f6e 100644 --- a/lustre/obdclass/obd_config.c +++ b/lustre/obdclass/obd_config.c @@ -1098,13 +1098,15 @@ static ssize_t process_param2_config(struct lustre_cfg *lcfg) kfree(subsys); if (kobj) { char *value = param; - char *envp[3]; + char *envp[4]; int i; 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++) @@ -1457,14 +1459,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", @@ -1473,6 +1486,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