diff options
author | Zijun Hu <zijun.hu@oss.qualcomm.com> | 2025-07-14 23:34:17 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-08-19 12:41:18 +0200 |
commit | 1ba0fb42aa6a5f072b1b8c0b0520b32ad4ef4b45 (patch) | |
tree | bd1f774c7b65d7ace6996002cf2ab6d4e52336a1 | |
parent | 52e2bb5ff089d65e2c7d982fe2826dc88e473d50 (diff) |
char: misc: Does not request module for miscdevice with dynamic minor
misc_open() may request module for miscdevice with dynamic minor, which
is meaningless since:
- The dynamic minor allocated is unknown in advance without registering
miscdevice firstly.
- Macro MODULE_ALIAS_MISCDEV() is not applicable for dynamic minor.
Fix by only requesting module for miscdevice with fixed minor.
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
Signed-off-by: Zijun Hu <zijun.hu@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250714-rfc_miscdev-v6-6-2ed949665bde@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/char/misc.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/char/misc.c b/drivers/char/misc.c index 96ed343cf5c8..a0aae0fc7926 100644 --- a/drivers/char/misc.c +++ b/drivers/char/misc.c @@ -132,7 +132,8 @@ static int misc_open(struct inode *inode, struct file *file) break; } - if (!new_fops) { + /* Only request module for fixed minor code */ + if (!new_fops && minor < MISC_DYNAMIC_MINOR) { mutex_unlock(&misc_mtx); request_module("char-major-%d-%d", MISC_MAJOR, minor); mutex_lock(&misc_mtx); @@ -144,10 +145,11 @@ static int misc_open(struct inode *inode, struct file *file) new_fops = fops_get(iter->fops); break; } - if (!new_fops) - goto fail; } + if (!new_fops) + goto fail; + /* * Place the miscdevice in the file's * private_data so it can be used by the |