Я бы посоветовал быть немного более оборонительным в вашем коде:
#include <linux/module.h>
#include <linux/capability.h>
int do_my_work(void)
{
struct module *mod;
char name[MODULE_NAME_LEN];
int ret, forced = 0;
if (!capable(CAP_SYS_MODULE) || modules_disabled)
return -EPERM;
/* Set up the name, yada yada */
name[MODULE_NAME_LEN - 1] = '\0';
/* Unless you absolutely need an uninterruptible wait, do this. */
if (mutex_lock_interruptible(&module_mutex) != 0) {
ret = -EINTR;
goto out_stop;
}
mod = find_module(name);
if (!mod) {
ret = -ENOENT;
goto out;
}
if (!list_empty(&mod->modules_which_use_me)) {
/* Debug it. */
}
out:
mutex_unlock(&module_mutex);
out_stop:
return(ret);
}
module_mutex получается ядром при различных операциях над модулями.Все они находятся в / kernel / module.c и являются:
- При инициализации каждого модуля отдельно, а также всех модулей (например, при загрузке).
- Удаление модуля
- Ожидание, пока на модуль никто не ссылается (не использует).
- Когда файловой системе / proc требуется список модулей (oprofile и co. Используютthis).
- В коде, связанном с трассировкой;итерация и обновление точек трассировки.