Здравствуйте,
Я пишу небольшой модуль уровня ядра. Столкнулся с проблемой, с которой бъюсь уже две недели...
Я работаю с /proc файловой системой следующим образом: сначала создаю файл стандартными средствами (create_proc_entry()) а потом открываю его, как файл с помощью (filp_open()).
На ядре 2.4.24 данный код работает без проблем. А вот на 2.4.18 (сменить версию ядра не могу по требованию заказчика) есть одна странность - у открытого файла поле fp->f_dentry->d_inode->u.generic_ip содержит NULL а не адрес proc_dir_entry как должно быть согласно описанию. Из-за этого мой драйвер не работает.
Проблема, очевидно скрыта где-то внутри filp_open либо create_proc_entry что-то не так создает.
Прошу помочь разобраться... Вот код примера:
<pre>
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); } </pre>
Надеюсь, гуру помогут разобраться...
Станислав.