Подробности
[В начало]
Проблема в реализации № L0036
Краткое описание
gigaset: отсутствие вызовы module_put перед перезапуском if_open()
Подробное описание
Когда if_open() вызывает try_module_get(), а затем, после неудачной попытки захватить мьютекс, возвращает -ERESTARTSYS, она не вызывает module_put(). Вызов if_open() начинается снова, и внова захватывается модуль. Однако при закрытии файла устройства, if_close() вызывает module_put только один раз, и, в результате, модуль нельзя выгрузить.
Способы устранения
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 59de638..e35058b 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c @@ -156,8 +156,10 @@ static int if_open(struct tty_struct *tty, struct file *filp) if (!cs || !try_module_get(cs->driver->owner)) return -ENODEV; - if (mutex_lock_interruptible(&cs->mutex)) + if (mutex_lock_interruptible(&cs->mutex)) { + module_put(cs->driver->owner); return -ERESTARTSYS; + } tty->driver_data = cs; ++cs->open_count;
Компонент
linux-kernel 2.6.39
Ссылки
https://lkml.org/lkml/2011/6/17/321
Принято
https://lkml.org/lkml/2011/6/17/321 commit 2f9381e
Статус
Исправлено в kernel 3.0-rc4
[В начало]
»