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);

--
2.8.1

Reply via email to