Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Driver Core: misc: add nodename support for misc devices.

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>

authored by

Kay Sievers and committed by
Greg Kroah-Hartman
d4056405 6fcf53ac

+17 -3
+1
arch/x86/kernel/microcode_core.c
··· 236 236 static struct miscdevice microcode_dev = { 237 237 .minor = MICROCODE_MINOR, 238 238 .name = "microcode", 239 + .devnode = "cpu/microcode", 239 240 .fops = &microcode_fops, 240 241 }; 241 242
+1
drivers/char/hw_random/core.c
··· 153 153 static struct miscdevice rng_miscdev = { 154 154 .minor = RNG_MISCDEV_MINOR, 155 155 .name = RNG_MODULE_NAME, 156 + .devnode = "hwrng", 156 157 .fops = &rng_chrdev_ops, 157 158 }; 158 159
+12 -3
drivers/char/misc.c
··· 168 168 .open = misc_open, 169 169 }; 170 170 171 - 172 171 /** 173 172 * misc_register - register a miscellaneous device 174 173 * @misc: device structure ··· 216 217 misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7); 217 218 dev = MKDEV(MISC_MAJOR, misc->minor); 218 219 219 - misc->this_device = device_create(misc_class, misc->parent, dev, NULL, 220 - "%s", misc->name); 220 + misc->this_device = device_create(misc_class, misc->parent, dev, 221 + misc, "%s", misc->name); 221 222 if (IS_ERR(misc->this_device)) { 222 223 err = PTR_ERR(misc->this_device); 223 224 goto out; ··· 263 264 EXPORT_SYMBOL(misc_register); 264 265 EXPORT_SYMBOL(misc_deregister); 265 266 267 + static char *misc_nodename(struct device *dev) 268 + { 269 + struct miscdevice *c = dev_get_drvdata(dev); 270 + 271 + if (c->devnode) 272 + return kstrdup(c->devnode, GFP_KERNEL); 273 + return NULL; 274 + } 275 + 266 276 static int __init misc_init(void) 267 277 { 268 278 int err; ··· 287 279 err = -EIO; 288 280 if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) 289 281 goto fail_printk; 282 + misc_class->nodename = misc_nodename; 290 283 return 0; 291 284 292 285 fail_printk:
+1
drivers/md/dm-ioctl.c
··· 1513 1513 static struct miscdevice _dm_misc = { 1514 1514 .minor = MISC_DYNAMIC_MINOR, 1515 1515 .name = DM_NAME, 1516 + .devnode = "mapper/control", 1516 1517 .fops = &_ctl_fops 1517 1518 }; 1518 1519
+1
drivers/net/tun.c
··· 1366 1366 static struct miscdevice tun_miscdev = { 1367 1367 .minor = TUN_MINOR, 1368 1368 .name = "tun", 1369 + .devnode = "net/tun", 1369 1370 .fops = &tun_fops, 1370 1371 }; 1371 1372
+1
include/linux/miscdevice.h
··· 41 41 struct list_head list; 42 42 struct device *parent; 43 43 struct device *this_device; 44 + const char *devnode; 44 45 }; 45 46 46 47 extern int misc_register(struct miscdevice * misc);