LINUX.ORG.RU

Чудеса в ядре 2.4.18


0

0

Добрый день всем!

Есть следующий пример, в котором создается файл на /proc который тут же открывается через файловый дескриптор.

Так вот, проблема в том, что fp->f_dentry->d_inode->u.generic_ip
содержит NULL (вместо адреса file_entry, как ожидается) поэтому дальнейшая работа из ядра с этим файлом проваливается.

С другой стороны, созданный файл открвается и читается из user (c помощью open(...)), значит в данном случае u.generic_ip не 0, если верить исходникам операции чтения из файла.

Так вот вопрос: кто виноват? или create_proc_entry(...) что-то не то создал или filp_open(...) что-то не так открыл.

Этот же самый код без проблем работает в 2.4.24, но я не могу на него (ядро) перейти по условиям задачи...

С надеждой на помощь...

С.П.

my_root = create_proc_entry("test_dir",
                            (S_IFDIR | S_IRUGO | S_IXUGO),
                            (struct proc_dir_entry*)0);
if (my_root == NULL) 
{ 
  result = -ENOMEM; 
  goto out; 
} 
my_root->owner = THIS_MODULE; 

printk("<1>dir_iops: %p\n",my_root->proc_iops);
printk("<1>dir_fops: %p\n",my_root->proc_fops); 

file_entry = create_proc_entry("testname",
                               (S_IRUGO | S_IWUGO), 
                               my_root);

file_entry->owner = THIS_MODULE;
file_entry->read_proc = vars_reader; 

printk("<1>file_iops: %p\n",file_entry->proc_iops);
printk("<1>file_fops: %p\n",file_entry->proc_fops);
printk("<1>file_data: %p\n",file_entry->data);
printk("<1>file_read_proc: %p\n",file_entry->read_proc);
printk("<1>file_write_proc: %p\n",file_entry->write_proc); 

fp = filp_open("/proc/test_dir/testname", O_RDONLY, 0);

if (IS_ERR(fp))
{ 
  printk("<1>Error open file with code %ld\n",-PTR_ERR(fp));
}
else
{ 
 printk("<1>vsfmnt: %p\n",fp->f_vfsmnt);
 printk("<1>fops: %p\n",fp->f_op); 
 printk("<1>node: %p\n",fp->f_dentry->d_inode->u.generic_ip);
 filp_close(fp,0);
}

anonymous
Ответ на: Чудеса от Murr

А где можно почитать про эту технику отладки?

С.П.

anonymous
()

> printk("<1>node: %p\n",fp->f_dentry->d_inode->u.generic_ip);

а попробуйте поискать значение file_entry в fp->f_dentry->d_inode,
то есть, рассматривайте d_inode как указатель на массив void*.
может, он там по другому смещению?

ну уж больно это смахивает на проблемы с include'ами или config.

idle ★★★★★
()
Ответ на: комментарий от idle

В результате пересборки ядра для работы с KDB проблема неожиданно решилась... Похоже, действительно что-то не то было в include или еще где... Но был полностью переписан /usr/src/linux (kernel tree взят с kernel.org). Больше ничего не трогали...

Сейчас будем смотреть, что будет на простом, не пропатченном под kdb ядре...

С.П.

anonymous
()
Ответ на: комментарий от anonymous

Чудеса

Похоже, и правда проблема с includes/config/gcc :).
Во всяком случае kdb патч не должен сильно затрагивать архитектурно-независимый код.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.