diff -urNp linux-1255/drivers/input/input.c linux-1261/drivers/input/input.c --- linux-1255/drivers/input/input.c +++ linux-1261/drivers/input/input.c @@ -34,6 +34,7 @@ #include #include #include +#include MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("Input layer module"); @@ -370,12 +371,20 @@ void input_unregister_handler(struct inp static int input_open_file(struct inode *inode, struct file *file) { - struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5]; - struct file_operations *old_fops, *new_fops = NULL; + struct input_handler *handler; + struct file_operations *old_fops, *new_fops; + unsigned int minor = MINOR(inode->i_rdev); int err; - /* No load-on-demand here? */ - if (!handler || !(new_fops = fops_get(handler->fops))) + /* XXX Are we sure there's no locking problem here? */ + if (!(handler = input_table[minor >> 5])) { + char modnam[sizeof("char-major-00000-000000000")]; + sprintf(modnam, "char-major-%d-%d", INPUT_MAJOR, minor & ~0x1f); + request_module(modnam); + if (!(handler = input_table[minor >> 5])) + return -ENODEV; + } + if (!(new_fops = fops_get(handler->fops))) return -ENODEV; /*