On 04/20/2016 12:17 AM, Davidlohr Bueso wrote:
locking/pvqspinlock: Robustify init_qspinlock_stat()

Specifically around the debugfs file creation calls,
I have no idea if they could ever possibly fail, but
this is core code (debug aside) so lets at least
check the return value and inform anything fishy.

Signed-off-by: Davidlohr Bueso <dbu...@suse.de>
---
kernel/locking/qspinlock_stat.h | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/kernel/locking/qspinlock_stat.h b/kernel/locking/qspinlock_stat.h
index 72722334237a..22e025309845 100644
--- a/kernel/locking/qspinlock_stat.h
+++ b/kernel/locking/qspinlock_stat.h
@@ -212,10 +212,8 @@ static int __init init_qspinlock_stat(void)
    struct dentry *d_qstat = debugfs_create_dir("qlockstat", NULL);
    int i;

-    if (!d_qstat) {
-        pr_warn("Could not create 'qlockstat' debugfs directory\n");
-        return 0;
-    }
+    if (!d_qstat)
+        goto out;

    /*
     * Create the debugfs files
@@ -225,12 +223,20 @@ static int __init init_qspinlock_stat(void)
     * performance.
     */
    for (i = 0; i < qstat_num; i++)
-        debugfs_create_file(qstat_names[i], 0400, d_qstat,
-                   (void *)(long)i, &fops_qstat);
+        if (!debugfs_create_file(qstat_names[i], 0400, d_qstat,
+                     (void *)(long)i, &fops_qstat))
+            goto fail_undo;
+
+ if (!debugfs_create_file(qstat_names[qstat_reset_cnts], 0200, d_qstat,
+                 (void *)(long)qstat_reset_cnts, &fops_qstat))
+        goto fail_undo;

-    debugfs_create_file(qstat_names[qstat_reset_cnts], 0200, d_qstat,
-               (void *)(long)qstat_reset_cnts, &fops_qstat);
    return 0;
+fail_undo:
+    debugfs_remove_recursive(d_qstat);
+out:
+    pr_warn("Could not create 'qlockstat' debugfs entries\n");
+    return -ENOMEM;
}
fs_initcall(init_qspinlock_stat);


Reviewed-by: Waiman Long <waiman.l...@hpe.com>

Reply via email to