пожалуйста, если вы не врубаетесь про что речь не засоряйте ветку форума!!! Это отвлекает от толковых ответов!
вопрос по VFS, но подобные методы я встречал и в сетевой подсистеме. Вероятно также можно найти и в других подстистемах!
Я правильно понимаю:
1)inode_hashtable - это голова двухсвязного списка всех голов индексных дескрипторов в системе!
2)Этой строчкой получаем голову двухсвязного списка файловой системы на которую указывает sb и на которой "расположен" ino:
struct list_head * head = inode_hashtable + hash(sb,ino);
static inline unsigned long hash(struct super_block *sb, unsigned long i_ino)
{
unsigned long tmp = i_ino + ((unsigned long) sb / L1_CACHE_BYTES);
tmp = tmp + (tmp >> I_HASHBITS);
return tmp & I_HASHMASK;
}
Дело в том, что вышеописаннаю переменнаю head используется функцией find_inode и там есть такой код:
tmp = head;
for (;;) {
tmp = tmp->next;
inode = NULL;
if (tmp == head)
break;
inode = list_entry(tmp, struct inode, i_hash);
Вот здесь не понятно:
---------------------------------
if (inode->i_ino != ino)
continue;
if (inode->i_sb != sb)
continue;
------------------------------------
Если же hash хэширует по sb и inode, то почему тогда здесь идет проверка на то что указатель на суперблок может не соответствовать тому по которому мы выше получмли адрес head?????????
ПЛИЗ - РАЗЪЯСНИТИ СИТУАЦИЮ!
СПАСИБО!!!