Объект dentry

Объект dentry

Как уже рассказывалось, подсистема VFS представляет каталоги так же, как и файлы. В имени пути /bin/vi, и элемент bin, и элемент vi — это файлы, только bin — это специальный файл, который является каталогом, a vi — это обычный файл. Объекты файловых индексов служат для представления обоих этих компонентов. Несмотря на такую полезную унификацию, подсистеме VFS также необходимо выполнять операции, специфичные для каталогов, такие как поиск компонента пути по его имени, проверка того, что указанный элемент пути существует, и переход на следующий компонент пути.

Для решения этой задачи в подсистеме VFS реализована концепция элемента каталога (directory entry или dentry). Объект dentry — это определенный компонент пути. В предыдущем примере компоненты /, bin и vi — это объекты элементов каталога. Первые два — это каталоги, а последний — обычный файл. Важным моментом является то, что все объекты dentry — это компоненты пути, включая и обычные файлы.

Элементы пути также могут включать в себя точки монтирования. В имени пути /mnt/cdrom/foo, компоненты /, mnt, cdrom и foo — это все объекты типа dentry. Подсистема VFS при выполнении операций с каталогами по необходимости конструирует объекты элементов каталога на лету.

Объекты типа dentry представлены с помощью структуры struct dentry и определены в файле <linux/dcache.h>. Эта структура с комментариями, которые определяют назначение каждого поля, имеет следующий вид.

struct dentry {

 atomic_t                 d_count;     /* счетчик использования */

 unsigned long            d_vfs_flags; /* флаги кэша объектов dentry */

 spinlock_t               d_lock; /* блокировка данного объекта dentry */

 struct inode             *d_inode; /* соответствующий файловый индекс */

 struct list_head         d_lru; /* список неиспользованных объектов */

 struct list_head         d_child;     /* список объектов у родительского

                                          экземпляра */

 struct list_head         d_subdirs;   /* подкаталоги */

 struct list_head         d_alias;     /* список альтернативных (alias)

                                          индексов */

 unsigned long            d_time;      /* время проверки правильности */

 struct dentry_operations *d_op;       /* таблица операций с элементом

                                          каталога */

 struct super_block       *d_sb;       /* связанный суперблок */

 unsigned int             d_flags;     /* флаги элемента каталога */

 int                      d_mounted;   /* является ли объект точкой

                                           монтирования */

 void                     *d_fsdata;   /* специфические данные

                                          файловой системы */

 struct rcu_head          d_rcu; /* блокировки RCU (read-copy update) */

 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 нет никаких флагов, которые указывают на то, изменен ли объект (т.е. должен ли он быть записан назад на диск).