driver core: add devname module aliases to allow module on-demand auto-loading
authorKay Sievers <kay.sievers@vrfy.org>
Thu, 20 May 2010 16:07:20 +0000 (18:07 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 25 May 2010 22:08:26 +0000 (15:08 -0700)
This adds:
  alias: devname:<name>
to some common kernel modules, which will allow the on-demand loading
of the kernel module when the device node is accessed.

Ideally all these modules would be compiled-in, but distros seems too
much in love with their modularization that we need to cover the common
cases with this new facility. It will allow us to remove a bunch of pretty
useless init scripts and modprobes from init scripts.

The static device node aliases will be carried in the module itself. The
program depmod will extract this information to a file in the module directory:
  $ cat /lib/modules/2.6.34-00650-g537b60d-dirty/modules.devname
  # Device nodes to trigger on-demand module loading.
  microcode cpu/microcode c10:184
  fuse fuse c10:229
  ppp_generic ppp c108:0
  tun net/tun c10:200
  dm_mod mapper/control c10:235

Udev will pick up the depmod created file on startup and create all the
static device nodes which the kernel modules specify, so that these modules
get automatically loaded when the device node is accessed:
  $ /sbin/udevd --debug
  ...
  static_dev_create_from_modules: mknod '/dev/cpu/microcode' c10:184
  static_dev_create_from_modules: mknod '/dev/fuse' c10:229
  static_dev_create_from_modules: mknod '/dev/ppp' c108:0
  static_dev_create_from_modules: mknod '/dev/net/tun' c10:200
  static_dev_create_from_modules: mknod '/dev/mapper/control' c10:235
  udev_rules_apply_static_dev_perms: chmod '/dev/net/tun' 0666
  udev_rules_apply_static_dev_perms: chmod '/dev/fuse' 0666

A few device nodes are switched to statically allocated numbers, to allow
the static nodes to work. This might also useful for systems which still run
a plain static /dev, which is completely unsafe to use with any dynamic minor
numbers.

Note:
The devname aliases must be limited to the *common* and *single*instance*
device nodes, like the misc devices, and never be used for conceptually limited
systems like the loop devices, which should rather get fixed properly and get a
control node for losetup to talk to, instead of creating a random number of
device nodes in advance, regardless if they are ever used.

This facility is to hide the mess distros are creating with too modualized
kernels, and just to hide that these modules are not compiled-in, and not to
paper-over broken concepts. Thanks! :)

Cc: Greg Kroah-Hartman <gregkh@suse.de>
Cc: David S. Miller <davem@davemloft.net>
Cc: Miklos Szeredi <miklos@szeredi.hu>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: Alasdair G Kergon <agk@redhat.com>
Cc: Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
Cc: Ian Kent <raven@themaw.net>
Signed-Off-By: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Documentation/devices.txt
arch/x86/kernel/microcode_core.c
drivers/net/ppp_generic.c
drivers/net/tun.c
fs/autofs4/dev-ioctl.c
fs/btrfs/super.c
fs/fuse/dev.c
include/linux/miscdevice.h

index 53d64d382343f13ff429906f9740e8d15de18739..1d83d124056c61854c87d6fed2d68cf870b5b3af 100644 (file)
@@ -443,6 +443,8 @@ Your cooperation is appreciated.
                231 = /dev/snapshot     System memory snapshot device
                232 = /dev/kvm          Kernel-based virtual machine (hardware virtualization extensions)
                233 = /dev/kmview       View-OS A process with a view
+               234 = /dev/btrfs-control        Btrfs control device
+               235 = /dev/autofs       Autofs control device
                240-254                 Reserved for local use
                255                     Reserved for MISC_DYNAMIC_MINOR
 
index 2cd8c544e41a22a224c8f29f3f517e609c60536e..fa6551d36c102105c8654c7d4f60f82e65990822 100644 (file)
@@ -260,6 +260,7 @@ static void microcode_dev_exit(void)
 }
 
 MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
+MODULE_ALIAS("devname:cpu/microcode");
 #else
 #define microcode_dev_init()   0
 #define microcode_dev_exit()   do { } while (0)
index 5441688daba70c6ad61f825fd911966041907c29..c5f8eb102bf76de12c86d2665b19b1c7fcb8d8b0 100644 (file)
@@ -2926,5 +2926,5 @@ EXPORT_SYMBOL(ppp_output_wakeup);
 EXPORT_SYMBOL(ppp_register_compressor);
 EXPORT_SYMBOL(ppp_unregister_compressor);
 MODULE_LICENSE("GPL");
-MODULE_ALIAS_CHARDEV_MAJOR(PPP_MAJOR);
-MODULE_ALIAS("/dev/ppp");
+MODULE_ALIAS_CHARDEV(PPP_MAJOR, 0);
+MODULE_ALIAS("devname:ppp");
index 97b25533e5fb1dd741bc7a2541ed598014707a99..005cad6895786099bde8c676c62e9d3e23fa20f0 100644 (file)
@@ -1649,3 +1649,4 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION);
 MODULE_AUTHOR(DRV_COPYRIGHT);
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_MISCDEV(TUN_MINOR);
+MODULE_ALIAS("devname:net/tun");
index d29b7f6df86285d173de7340c7a338d2d75d09fc..d832062869f6727846f4b28c46998cb36698e6d5 100644 (file)
@@ -736,11 +736,14 @@ static const struct file_operations _dev_ioctl_fops = {
 };
 
 static struct miscdevice _autofs_dev_ioctl_misc = {
-       .minor          = MISC_DYNAMIC_MINOR,
+       .minor          = AUTOFS_MINOR,
        .name           = AUTOFS_DEVICE_NAME,
        .fops           = &_dev_ioctl_fops
 };
 
+MODULE_ALIAS_MISCDEV(AUTOFS_MINOR);
+MODULE_ALIAS("devname:autofs");
+
 /* Register/deregister misc character device */
 int autofs_dev_ioctl_init(void)
 {
index 1866dff0538ef626a17d2dcbf29d9df4df46b3aa..2909a03e5230d7bf1d0653e4b40bd392a669703a 100644 (file)
@@ -832,11 +832,14 @@ static const struct file_operations btrfs_ctl_fops = {
 };
 
 static struct miscdevice btrfs_misc = {
-       .minor          = MISC_DYNAMIC_MINOR,
+       .minor          = BTRFS_MINOR,
        .name           = "btrfs-control",
        .fops           = &btrfs_ctl_fops
 };
 
+MODULE_ALIAS_MISCDEV(BTRFS_MINOR);
+MODULE_ALIAS("devname:btrfs-control");
+
 static int btrfs_interface_init(void)
 {
        return misc_register(&btrfs_misc);
index eb7e9423691feeefdffd269e4489d8e6cf6ad21c..e53df5ebb2b89904046e8a06808f68cd25fd6b5d 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 
 MODULE_ALIAS_MISCDEV(FUSE_MINOR);
+MODULE_ALIAS("devname:fuse");
 
 static struct kmem_cache *fuse_req_cachep;
 
index 8b5f7cc0fba6cd9f5f69f5521d00c788c2fe0dc9..b631c46cffd9c4fe52cf7c5bb5a5db7c88223d0a 100644 (file)
@@ -31,6 +31,8 @@
 #define FUSE_MINOR             229
 #define KVM_MINOR              232
 #define VHOST_NET_MINOR                233
+#define BTRFS_MINOR            234
+#define AUTOFS_MINOR           235
 #define MISC_DYNAMIC_MINOR     255
 
 struct device;