Driver Core: misc: add nodename support for misc devices.
authorKay Sievers <kay.sievers@vrfy.org>
Thu, 30 Apr 2009 13:23:42 +0000 (15:23 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 16 Jun 2009 04:30:25 +0000 (21:30 -0700)
This adds support for misc devices to report their requested nodename to
userspace.  It also updates a number of misc drivers to provide the
needed subdirectory and device name to be used for them.

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Jan Blunck <jblunck@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/x86/kernel/microcode_core.c
drivers/char/hw_random/core.c
drivers/char/misc.c
drivers/md/dm-ioctl.c
drivers/net/tun.c
include/linux/miscdevice.h

index 9c4461501fcbb9618ac3ce12fef93f990b8f3955..9371448290ac3c4f3a3489b0d9edbe55a5dd689b 100644 (file)
@@ -236,6 +236,7 @@ static const struct file_operations microcode_fops = {
 static struct miscdevice microcode_dev = {
        .minor                  = MICROCODE_MINOR,
        .name                   = "microcode",
+       .devnode                = "cpu/microcode",
        .fops                   = &microcode_fops,
 };
 
index e5d583c84e4f864ae31cb95534bd5befe6291ed6..fc93e2fc7c71220d02e31acbaf67d40eda7b3133 100644 (file)
@@ -153,6 +153,7 @@ static const struct file_operations rng_chrdev_ops = {
 static struct miscdevice rng_miscdev = {
        .minor          = RNG_MISCDEV_MINOR,
        .name           = RNG_MODULE_NAME,
+       .devnode        = "hwrng",
        .fops           = &rng_chrdev_ops,
 };
 
index a5e0db9d7662d4a060ff167260753b193a64ee9f..62c99fa59e2b5bf09ee792652648eab4760f37bc 100644 (file)
@@ -168,7 +168,6 @@ static const struct file_operations misc_fops = {
        .open           = misc_open,
 };
 
-
 /**
  *     misc_register   -       register a miscellaneous device
  *     @misc: device structure
@@ -217,8 +216,8 @@ int misc_register(struct miscdevice * misc)
                misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
        dev = MKDEV(MISC_MAJOR, misc->minor);
 
-       misc->this_device = device_create(misc_class, misc->parent, dev, NULL,
-                                         "%s", misc->name);
+       misc->this_device = device_create(misc_class, misc->parent, dev,
+                                         misc, "%s", misc->name);
        if (IS_ERR(misc->this_device)) {
                err = PTR_ERR(misc->this_device);
                goto out;
@@ -264,6 +263,15 @@ int misc_deregister(struct miscdevice *misc)
 EXPORT_SYMBOL(misc_register);
 EXPORT_SYMBOL(misc_deregister);
 
+static char *misc_nodename(struct device *dev)
+{
+       struct miscdevice *c = dev_get_drvdata(dev);
+
+       if (c->devnode)
+               return kstrdup(c->devnode, GFP_KERNEL);
+       return NULL;
+}
+
 static int __init misc_init(void)
 {
        int err;
@@ -279,6 +287,7 @@ static int __init misc_init(void)
        err = -EIO;
        if (register_chrdev(MISC_MAJOR,"misc",&misc_fops))
                goto fail_printk;
+       misc_class->nodename = misc_nodename;
        return 0;
 
 fail_printk:
index 823ceba6efa8dcccc95b14cf72986195c52b3ae8..1128d3fba797f38a89f39849eea012bc9daa22d1 100644 (file)
@@ -1513,6 +1513,7 @@ static const struct file_operations _ctl_fops = {
 static struct miscdevice _dm_misc = {
        .minor          = MISC_DYNAMIC_MINOR,
        .name           = DM_NAME,
+       .devnode        = "mapper/control",
        .fops           = &_ctl_fops
 };
 
index 811d3517fce0c99895b4738df64a60d934f86fcf..11a0ba47b67782d920f3bf5cb36d3e24d4874b63 100644 (file)
@@ -1366,6 +1366,7 @@ static const struct file_operations tun_fops = {
 static struct miscdevice tun_miscdev = {
        .minor = TUN_MINOR,
        .name = "tun",
+       .devnode = "net/tun",
        .fops = &tun_fops,
 };
 
index beb6ec99cfefb768b4ff43488c1a6137715eda15..052117744629bfd05e300528f99e5675574dda3e 100644 (file)
@@ -41,6 +41,7 @@ struct miscdevice  {
        struct list_head list;
        struct device *parent;
        struct device *this_device;
+       const char *devnode;
 };
 
 extern int misc_register(struct miscdevice * misc);