From: James Simmons Date: Tue, 9 Apr 2019 17:04:30 +0000 (-0400) Subject: LU-8066 obd: update udev event handling X-Git-Tag: 2.12.53~11 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=b0d162390ad63d9dff12295a19022f3152592f7c;p=fs%2Flustre-release.git 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 --- 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));