Основные поля vnode приведены в табл. 4.1.
Таблица 4.1. Поля vnode
Поле | Описание |
u_short vflag
| Флаги vnode |
u_short v_count
| Число ссылок на vnode |
struct filock *v_filocks
| Блокировки файла |
struct vfs *v_vfsmountedhere
| Указатель на подключенную файловую систему, если vnode является точкой монтирования |
struct vfs *v_vfsp
| Указатель на файловую систему, в которой находится файл |
enum vtype v_type
| Тип vnode: обычный файл, каталог, специальный файл устройства, символическая связь, сокет |
caddr_t v_data
| Указатель на данные, относящиеся к реальной файловой системе |
struct op
| Операции vnode |
Каждый vnode содержит число ссылок
v_count
, которое увеличивается при открытии процессом файла и уменьшается при его закрытии. Когда число ссылок становится равным нулю, вызывается операция
vn_inactive()
, которая сообщает реальной файловой системе, что на vnode никто больше не ссылается. После этого файловая система может освободить vnode (и, например, соответствующий ему inode) или поместить его в кэш для дальнейшего использования.
Поле
v_vfsp
указывает на файловую систему (структуру
vfs
, о которой мы поговорим в следующем разделе), в которой расположен файл, адресованный данным vnode. Если vnode является точкой монтирования, то поле
v_vfsmountednere
указывает на подключенную файловую систему, "перекрывающую" данный vnode.
Поле
v_data
указывает на данные, относящиеся к конкретной реализации реальной файловой системы. Например, для дисковой файловой системы ufs,
v_data
указывает на запись в таблице in-core inode.
Набор операций над vnode указан полем
v_op
. В терминах объектно-ориентированного программирования этот набор представляет собой виртуальные методы класса vnode. Он является своего рода шлюзом к реальной файловой системе, позволяя предоставить общий интерфейс виртуальной файловой системы и в то же время обеспечить специфические реализации функций работы с файлами, необходимые для различных типов файловых систем. Некоторые операции, большинство из которых уже знакомы читателю по системным вызовам, приведены в табл. 4.2.
Таблица 4.2. Операции с vnode виртуальной файловой системы
int (*vn_open)()
| Открыть vnode. Если операция предусматривает создание клона (размножение), то в результате будет размещен новый vnode. Обычно операции такого типа характерны для специальных файлов устройств. |
int (*vn_close)()
| Закрыть vnode. |
int (*vn_read)()
| Чтение данных файла, адресованного vnode. |
int (*vn_write)()
| Запись в файл, адресованный vnode. |
int (*vn_ioctl)()
| Задание управляющей команды. |
int (*vn_getaddr)()
| Получить атрибуты vnode: тип vnode, права доступа, владелец-пользователь, владелец-группа, идентификатор файловой системы, номер inode, число связей, размер файла, оптимальный размер блока для операций ввода/вывода, время последнего доступа, время последней модификации, время последней модификации vnode, число занимаемых блоков. |
int (*vn_setaddr)()
| Установить атрибуты vnode. Могут быть изменены UID, GID, размер файла и времена доступа и модификации. |
int (*vn_access)()
| Проверить права доступа к файлу, адресованному vnode. При этом производится отображение между атрибутами доступа файлов UNIX и атрибутами реальной файловой системы (например, DOS). |
int (*vn_lookup)()
| Произвести трансляцию имени файла в соответствующий ему vnode. |
int (*vn_create)()
| Создать новый файл и соответствующий ему vnode. |
int (*vn_remove)()
| Удалить имя файла в указанном vnode каталоге. |
int (*vn_link)()
| Создать жесткую связь между именем файла и vnode. |
int (*vn_mkdir)()
| Создать новый каталог в указанном vnode каталоге. |
int (*vn_rmdir)()
| Удалить каталог. |
int (*vn_readdir)()
| Считать записи каталога, адресованного vnode. |
int (*vn_symlink)()
| Создать символическую связь между новым именем и именем файла, расположенном в указанном vnode каталоге. |
int (*vn_readlink)()
| Чтение файла — символической связи. |
int (*vn_fsync)()
| Синхронизировать содержимое файла — записать все кэшированные данные. |
int (*vn_inactive)()
| Разрешить удаление vnode, т.к. число ссылок на vnode из виртуальной файловой системы стало равным нулю. |
Взаимосвязь между независимыми дескрипторами (vnode) и зависимыми от реализации метаданными файла показана на рис. 4.8.