/* Return the function table of a device. Load the driver if needed. Increment the reference count of module in question. */ static struct file_operations * get_chrfops(unsigned int major, unsigned int minor) { struct file_operations *ret = NULL; if (!major || major >= MAX_CHRDEV) return NULL; read_lock(&chrdevs_lock); ret = fops_get(chrdevs[major].fops); read_unlock(&chrdevs_lock); #ifdef CONFIG_KMOD if (ret && isa_tty_dev(major)) { lock_kernel(); if (need_serial(major,minor)) { /* Force request_module anyway, but what for? */ fops_put(ret); ret = NULL; } unlock_kernel(); } if (!ret) { char name[20]; sprintf(name, "char-major-%d", major); request_module(name); read_lock(&chrdevs_lock); ret = fops_get(chrdevs[major].fops); read_unlock(&chrdevs_lock); } #endif return ret; }
/* Return the function table of a device. Load the driver if needed. */ static struct file_operations * get_fops( unsigned int major, unsigned int minor, unsigned int maxdev, const char *mangle, /* String to use to build the module name */ struct device_struct tb[]) { struct file_operations *ret = NULL; if (major < maxdev){ #ifdef CONFIG_KMOD /* * I do get request for device 0. I have no idea why. It happen * at shutdown time for one. Without the following test, the * kernel will happily trigger a request_module() which will * trigger kmod and modprobe for nothing (since there * is no device with major number == 0. And furthermore * it locks the reboot process :-( * * Jacques Gelinas ([email protected]) * * A. Haritsis <*****@*****.**>: fix for serial module * though we need the minor here to check if serial dev, * we pass only the normal major char dev to kmod * as there is no other loadable dev on these majors */ if ((isa_tty_dev(major) && need_serial(major,minor)) || (major != 0 && !tb[major].fops)) { char name[20]; sprintf(name, mangle, major); request_module(name); } #endif ret = tb[major].fops; } return ret; }