PM: wakeup: simplify the output logic of pm_show_wakelocks()
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Jan 2022 18:44:20 +0000 (19:44 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 8 Feb 2022 17:15:26 +0000 (18:15 +0100)
commit c9d967b2ce40d71e968eb839f36c936b8a9cf1ea upstream.

The buffer handling in pm_show_wakelocks() is tricky, and hopefully
correct.  Ensure it really is correct by using sysfs_emit_at() which
handles all of the tricky string handling logic in a PAGE_SIZE buffer
for us automatically as this is a sysfs file being read from.

Reviewed-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
kernel/power/wakelock.c

index 1896386e16bbe0ddd6173cf7a9e95d42617488a4..78e354b1c593b80feb9bb0b2d782196dbd525a06 100644 (file)
@@ -38,23 +38,19 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active)
 {
        struct rb_node *node;
        struct wakelock *wl;
-       char *str = buf;
-       char *end = buf + PAGE_SIZE;
+       int len = 0;
 
        mutex_lock(&wakelocks_lock);
 
        for (node = rb_first(&wakelocks_tree); node; node = rb_next(node)) {
                wl = rb_entry(node, struct wakelock, node);
                if (wl->ws.active == show_active)
-                       str += scnprintf(str, end - str, "%s ", wl->name);
+                       len += sysfs_emit_at(buf, len, "%s ", wl->name);
        }
-       if (str > buf)
-               str--;
-
-       str += scnprintf(str, end - str, "\n");
+       len += sysfs_emit_at(buf, len, "\n");
 
        mutex_unlock(&wakelocks_lock);
-       return (str - buf);
+       return len;
 }
 
 #if CONFIG_PM_WAKELOCKS_LIMIT > 0