struct dcookie_struct *d_cookie; /* cookie-идентификатор */
struct dentry *d_parent; /* объект dentry
родительского каталога */
struct qstr d_name; /* имя dentry */
struct hlist_node d_hash; /* список хеширования */
struct hlist_head *d_bucket; /* сегмент хеш-таблицы */
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* короткое имя файла */
};
В отличие от предыдущих двух объектов, объект dentry не соответствует какой бы то ни было структуре данных на жестком диске. Подсистема VSF создает эти объекты на лету на основании строкового представления имени пути. Поскольку объекты элементов каталога не хранятся физически на дисках, то в структуре struct dentry
Состояние элементов каталога
Действительный объект элемента каталога, может быть в одном из трех состояний: используемый (used), неиспользуемый (unused) и негативный (negative).
Используемый объект соответствует существующему файловому индексу (т.е. поле d_inode
d_count — положительное число). Используемый элемент каталога используется подсистемой VFS, а также указывает на существующие данные, поэтому не может быть удален.Неиспользуемый объект типа dentry соответствует существующему объекту inode (поле d_inode
d_count содержит нулевое значение). Так как элемент каталога указывает на существующий объект, то он сохраняется на случай, если вдруг окажется нужным. Если объект не ликвидировать преждевременно, то его и не нужно будет создавать заново, если вдруг он понадобится в будущем, и поиск по имени пути пройдет быстрее. Когда же появляется необходимость освободить память, то такой объект элемента каталога может быть удален, потому что он никем не используется.Негативный объект dentry[72]
не связан с существующим файловым индексом (полеd_inode равно значению NULL), потому что или файловый индекс был удален, или соответствующий элемент пути никогда не существовал. Такие объекты элементов каталогов сохраняются, чтобы в будущем поиск по имени пути проходил быстрее. Хотя такие объекты dentry и полезны, но они при необходимости могут уничтожаться, поскольку никто их на самом деле не использует.Объект dentry может быть освобожден, оставаясь в слябовом кэше объектов, как обсуждалось в предыдущей главе. В таком случае на этот объект нет ссылок ни в коде VFS, ни в коде файловых систем.
Кэш объектов dentry
После того как подсистема VFS преодолела все трудности, связанные с переводом всех элементов пути в объекты элементов каталогов, и был достигнут конец пути, то было бы достаточно расточительным выбрасывать на ветер всю проделанную работу. Ядро кэширует объекты в кэше элементов каталога, который называют
Кэш объектов dentry состоит из трех частей.
• Список "используемых" объектов dentry, которые связаны с определенным файловым индексом (поле i_dentry
• Двухсвязный список неиспользуемых и негативных объектов dentry "с наиболее поздним использованием" (last recently used, LRU). Вставки элементов в этот список отсортированы по времени, поэтому элементы, которые находятся в начале списка, — самые новые. Когда ядро должно удалить элементы каталогов для освобождения памяти, то эти элементы берутся из конца списка, потому что там находятся элементы, которые использовались наиболее давно и для которых меньше шансов, что они понадобятся в ближайшем будущем.
• Хеш-таблица и хеш-функция, которые позволяют быстро преобразовать заданный путь в объект dentry.
Указанная хеш-таблица представлена с помощью массива dentry_hashtable
Значение ключа определяется функцией d_hash()
Поиск в хеш-таблице выполняется с помощью функции d_lookup()
NULL.