const void *value, size_t size, int flags);
Эта функция вызывается подсистемой VFS для установки одного из расширенных атрибутов (extended attributes)[71] с именем name
в значение value
для файла, соответствующего элементу каталога dentry
.
• int getxattr(struct dentry *dentry, const char *name,
void *value, size_t size);
Эта функция вызывается подсистемой VFS для копирования значения одного из расширенных атрибутов (extended attributes) с именем name
в область памяти с указателем value
.
• ssize_t listxattr(struct dentry *dentry, char *list, size_t size);
Эта функция должна копировать список всех атрибутов для указанного файла в буфер, соответствующий параметру list
.
• int removexattr(struct dentry *dentry, const char *name);
Эта функция удаляет указанный атрибут для указанного файла.
Объект 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
нет никаких флагов, которые указывают на то, изменен ли объект (т.е. должен ли он быть записан назад на диск).
Состояние элементов каталога
Действительный объект элемента каталога, может быть в одном из трех состояний: используемый (used), неиспользуемый (unused) и негативный (negative).
Используемый объект соответствует существующему файловому индексу (т.е. поле d_inode
указывает на связанный объект типа mode) и используется один или более раз (т.е. значение поля d_count
— положительное число). Используемый элемент каталога используется подсистемой VFS, а также указывает на существующие данные, поэтому не может быть удален.
Неиспользуемый объект типа dentry соответствует существующему объекту inode (поле d_inode
указывает на объект файлового индекса), но подсистема VFS в данный момент не использует этот элемент каталога (поле d_count
содержит нулевое значение). Так как элемент каталога указывает на существующий объект, то он сохраняется на случай, если вдруг окажется нужным. Если объект не ликвидировать преждевременно, то его и не нужно будет создавать заново, если вдруг он понадобится в будущем, и поиск по имени пути пройдет быстрее. Когда же появляется необходимость освободить память, то такой объект элемента каталога может быть удален, потому что он никем не используется.
Негативный объект dentry[72] не связан с существующим файловым индексом (поле d_inode
равно значению NULL
), потому что или файловый индекс был удален, или соответствующий элемент пути никогда не существовал. Такие объекты элементов каталогов сохраняются, чтобы в будущем поиск по имени пути проходил быстрее. Хотя такие объекты dentry и полезны, но они при необходимости могут уничтожаться, поскольку никто их на самом деле не использует.
Объект dentry может быть освобожден, оставаясь в слябовом кэше объектов, как обсуждалось в предыдущей главе. В таком случае на этот объект нет ссылок ни в коде VFS, ни в коде файловых систем.
Кэш объектов dentry
После того как подсистема VFS преодолела все трудности, связанные с переводом всех элементов пути в объекты элементов каталогов, и был достигнут конец пути, то было бы достаточно расточительным выбрасывать на ветер всю проделанную работу. Ядро кэширует объекты в кэше элементов каталога, который называют dcache.
71
Расширенные атрибуты — это новая функциональность, которая появилась в ядре 2.6 для того, чтобы создавать параметры файлов в виде пар имя/значение по аналогии с базой данных. Эти параметры поддерживаются не многими файловыми системами, и к тому же они еще используются не достаточно широко.
72
Это название несколько сбивает с толку. В таких объектах нет ничего негативного или отрицательного. Более удачным было бы, наверное, название invalid dentry или несуществующий элемент каталога.