Whamcloud - gitweb
LU-8066 obd: update udev event handling 24/34624/5
authorJames Simmons <uja.ornl@yahoo.com>
Tue, 9 Apr 2019 17:04:30 +0000 (13:04 -0400)
committerOleg Drokin <green@whamcloud.com>
Tue, 30 Apr 2019 03:38:05 +0000 (03:38 +0000)
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 <uja.ornl@yahoo.com>
Reviewed-on: https://review.whamcloud.com/34624
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Emoly Liu <emoly@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Ben Evans <bevans@cray.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/obdclass/obd_config.c

index de558e7..3ee0f6e 100644 (file)
@@ -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));