just_a_student писал(а):
Вызов из тестовой программы я не менял. Теперь вызов ioctl из тестовой программы успешно перенаправляется на функцию Ioctl() из модуля.
Я не случайно спрашивал: "успешно перенаправляется", или успешно выполняется вызов операции ioctl() (с ожидаемым результатом)???
Потому, что в предшествующих версиях ядра операция (поле .ioctl) определялась в struct file_operations с прототипом:
Код: Выделить всё
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
А теперь обработчики для ioctl определяются с прототипом:
Код: Выделить всё
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
И если
в старом коде (использующем .ioctl) только заменить .ioctl в инициализации struct file_operations на .unlocked_ioctl , то происходят очень смешные вещи (я только-что проверил на коде своих примеров!):
- код нормально скомпилируется ... будут только невнятные warning-и на инициализацию struct file_operations и не более!
- модуль будет загружаться ... как-будто ОК!
- но нормально дешифрироваться коды ioctl()
не будут - параметры вызова "сдвинуты" ...
- и будет сыпаться ошибка (уже из обработчика ioctl - ... "успешно перенаправляется"
) о недопустимом коде операции (правда, если там стоит контроль допустимости кода ioctl() ... что люди, знающие об опасности этой операции, делают всегда).