Подскажите с f->f_op->read

(1/4) > >>

opushkin:
Подскажите кто знает!
Читаю-пишу в ttyS0 из прерывания таймера примерно так:
void ndt_irq (unsigned long data)
{
spin_lock_bh(&timer_lock);
struct my_buf *tbf;
tbf = &rbuffer;

fs=get_fs();
set_fs(KERNEL_DS);
if (f && f->f_dentry &&
 f->f_op && f->f_op->read) {
 .......
 retval = f->f_op->read(f, &tbf->rc, 1, &f->f_pos);
 ........
 f->f_op->write(f, "NICHEVO NE CHITAET", 18, &f->f_pos);
 
 if (retval <= 0) printk("<0> ^tstnd: READE returns: %d\n", retval);
 }
 else printk("<0> ^tstnd: stuct FILE is empty\n");
set_fs(fs);

mod_timer(&timer, jiffies + HZ);
spin_unlock_bh(&timer_lock);
}
Передаётся всё нормально, но ничего не читает. Возвращает код -11 (типа: пилите Шура - они золотые)
Если циклить на чтении - пилит до бесконечности.

RXL:
Не вижу назначение f

opushkin:
Назначение при инициализации модуля  такое:
fs=get_fs();
set_fs(KERNEL_DS);
  f=filp_open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY, 0666);
   if(f == NULL) printk (KERN_WARNING "^tstnd: Error opening ttyS.\n");
set_fs(fs);

p.s. Прошу прощенья за задержку ответа - понадеялся на оповещение через email.

RXL:
Цитата

Код:

   if(f == NULL) printk (KERN_WARNING "^tstnd: Error opening ttyS.\n");


Код:

if (IS_ERROR(f)) ...
Ошибкой является не NULL, а ERR_PTR(error). См. исходники fs/open.c

opushkin:
Спасибо.
У меня эта функция определена как IS_ERR(), но всё равно никаких ERR нету, и чтения тоже.
Смутно помню, где то мелькало, что макросы set_fr/get_fs в обработчиках прерываний не работают, и нужно использовать очереди, но чего очереди не уточнялось и не могу найти -где видел. Да и если бы они сдесь не работали, так оно бы не работали и для write.

Навигация

[0] Главная страница сообщений

[#] Следующая страница