diff
+ #include <linux/kref.h>
+ 
+ struct name_ref {
+     char *name;
+     struct kref refcount;
+ };
+ 
+ static void name_release(struct kref *ref)
+ {
+     struct name_ref *nr = container_of(ref, struct name_ref, refcount);
+     kfree(nr->name);
+     kfree(nr);
+ }
+ 
  static int register_device(int minor, struct pp_struct *pp)
  {
      ...
-     char *name;
+     struct name_ref *nr;
      ...
-     name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
-     if (name == NULL)
+     nr = kmalloc(sizeof(*nr), GFP_KERNEL);
+     if (!nr)
          return -ENOMEM;
+     nr->name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
+     if (!nr->name) {
+         kfree(nr);
+         return -ENOMEM;
+     }
+     kref_init(&nr->refcount);
      ...
-     pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
+     pdev = parport_register_dev_model(port, nr->name, &ppdev_cb, index);
      ...
      if (!pdev) {
-         pr_warn("%s: failed to register device!\n", name);
+         pr_warn("%s: failed to register device!\n", nr->name);
          ...
      }
      ...
-     kfree(name);
+     kref_put(&nr->refcount, name_release);
  }
