kernfs: handle null pointers while printing node name and path
authorKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Wed, 8 Feb 2017 11:28:55 +0000 (14:28 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Feb 2017 15:02:26 +0000 (16:02 +0100)
Null kernfs nodes could be found at cgroups during construction.
It seems safer to handle these null pointers right in kernfs in
the same way as printf prints "(null)" for null pointer string.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/kernfs/dir.c
include/trace/events/cgroup.h

index cf4c636ff4da5ab2d345261fc3d7e4f0db6d4c3c..439b946c48080f1ffad11427c8f4c3d68b2e9fa6 100644 (file)
@@ -41,6 +41,9 @@ static bool kernfs_lockdep(struct kernfs_node *kn)
 
 static int kernfs_name_locked(struct kernfs_node *kn, char *buf, size_t buflen)
 {
+       if (!kn)
+               return strlcpy(buf, "(null)", buflen);
+
        return strlcpy(buf, kn->parent ? kn->name : "/", buflen);
 }
 
@@ -110,6 +113,8 @@ static struct kernfs_node *kernfs_common_ancestor(struct kernfs_node *a,
  * kn_to:   /n1/n2/n3         [depth=3]
  * result:  /../..
  *
+ * [3] when @kn_to is NULL result will be "(null)"
+ *
  * Returns the length of the full path.  If the full length is equal to or
  * greater than @buflen, @buf contains the truncated path with the trailing
  * '\0'.  On error, -errno is returned.
@@ -123,6 +128,9 @@ static int kernfs_path_from_node_locked(struct kernfs_node *kn_to,
        size_t depth_from, depth_to, len = 0;
        int i, j;
 
+       if (!kn_to)
+               return strlcpy(buf, "(null)", buflen);
+
        if (!kn_from)
                kn_from = kernfs_root(kn_to)->kn;
 
@@ -166,6 +174,8 @@ static int kernfs_path_from_node_locked(struct kernfs_node *kn_to,
  * similar to strlcpy().  It returns the length of @kn's name and if @buf
  * isn't long enough, it's filled upto @buflen-1 and nul terminated.
  *
+ * Fills buffer with "(null)" if @kn is NULL.
+ *
  * This function can be called from any context.
  */
 int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen)
index ab68640a18d0ef7ba1b9fd0113abb9e3ff9a1edf..c226f50e88fa2a9bd6de5fd5621773a185744424 100644 (file)
@@ -61,19 +61,15 @@ DECLARE_EVENT_CLASS(cgroup,
                __field(        int,            id                      )
                __field(        int,            level                   )
                __dynamic_array(char,           path,
-                               cgrp->kn ? cgroup_path(cgrp, NULL, 0) + 1
-                                        : strlen("(null)"))
+                               cgroup_path(cgrp, NULL, 0) + 1)
        ),
 
        TP_fast_assign(
                __entry->root = cgrp->root->hierarchy_id;
                __entry->id = cgrp->id;
                __entry->level = cgrp->level;
-               if (cgrp->kn)
-                       cgroup_path(cgrp, __get_dynamic_array(path),
-                                   __get_dynamic_array_len(path));
-               else
-                       __assign_str(path, "(null)");
+               cgroup_path(cgrp, __get_dynamic_array(path),
+                                 __get_dynamic_array_len(path));
        ),
 
        TP_printk("root=%d id=%d level=%d path=%s",
@@ -119,8 +115,7 @@ DECLARE_EVENT_CLASS(cgroup_migrate,
                __field(        int,            dst_id                  )
                __field(        int,            dst_level               )
                __dynamic_array(char,           dst_path,
-                               dst_cgrp->kn ? cgroup_path(dst_cgrp, NULL, 0) + 1
-                                            : strlen("(null)"))
+                               cgroup_path(dst_cgrp, NULL, 0) + 1)
                __field(        int,            pid                     )
                __string(       comm,           task->comm              )
        ),
@@ -129,11 +124,8 @@ DECLARE_EVENT_CLASS(cgroup_migrate,
                __entry->dst_root = dst_cgrp->root->hierarchy_id;
                __entry->dst_id = dst_cgrp->id;
                __entry->dst_level = dst_cgrp->level;
-               if (dst_cgrp->kn)
-                       cgroup_path(dst_cgrp, __get_dynamic_array(dst_path),
-                                   __get_dynamic_array_len(dst_path));
-               else
-                       __assign_str(dst_path, "(null)");
+               cgroup_path(dst_cgrp, __get_dynamic_array(dst_path),
+                                     __get_dynamic_array_len(dst_path));
                __entry->pid = task->pid;
                __assign_str(comm, task->comm);
        ),