Для каждого файла в системе существует представляющий его индекс (хотя объект файлового индекса создается в памяти только тогда, когда к файлу осуществляется доступ). Это справедливо и для специальных
файлов, таких как файлы устройств или конвейеры. Следовательно, некоторые из полей структуры
struct inode
относятся к этим специальным файлам. Например, поле
i_pipe
указывает на структуру данных именованного конвейера. Если индекс не относится к именованному конвейеру, то это поле просто содержит значение
NULL
Другие поля, связанные со специальными файлами, — это
i_devices
,
i_bdev
,
i_cdev
.
Может оказаться, что та или иная файловая система не поддерживает тех свойств, которые присутствуют в объекте
inode
. Например, некоторые файловые системы не поддерживают такого атрибута, как время создания файла. В этом случае файловая система может реализовать это свойство как угодно. Например, поле
i_ctime
можно сделать нулевым или равным значению поля
i_mtime
.
Операции с файловыми индексами
Так же как и в случае операций суперблока, важным является поле
inode_operations
, в котором описаны функции файловой системы, которые могут быть вызваны подсистемой VFS для объекта файлового индекса. Как и для суперблока, операции с файловыми индексами могут быть вызваны следующим образом.
i->i_op->truncate(i);
где переменная
i
содержит указатель на определенный объект файлового индекса. В данном случае для индекса
i
выполняется операция
truncate
, которая определена для файловой системы, в которой находится указанный файловый индекс
i
. Структура
inode_operations
определена в файле
<linux/fs.h>
, как показано ниже.
struct inode_operations {
int (*create)(struct inode*, struct dentry*, int);
Эта функция производит поиск файлового индекса в указанном каталоге. Файловый индекс должен соответствовать имени файла, хранящемуся в указанном объекте элемента каталога.
•
int link(struct dentry *old_dentry, struct inode *dir,
struct dentry *dentry);
Эта функция вызывается из системного вызова
link
для создания жесткой ссылки (hard link) на файл, соответствующий элементу каталога
old_dentry
в каталоге
dir
. Новая ссылка должна иметь имя, которое хранится в указанном элементе каталога
dentry
.
•
int unlink(struct inode *dir, struct dentry *dentry);
Эта функция вызывается из системного вызова
unlink
для удаления файлового индекса, соответствующего элементу каталога
dentry
в каталоге
dir
.
•
int symlink(struct inode *dir, struct dentry *dentry,
const char *symname);
Эта функция вызывается из системного вызова
symlink
для создания символьной ссылки с именем
symname
на файл, которому соответствует элемент каталога
dentry
в каталоге
dir
.
•
int mkdir(struct inode *dir, struct dentry *dentry, int mode);
Эта функция вызывается из системного вызова
mkdir
для создания нового каталога с указанным режимом доступа (
mode
).
•
int rmdir(struct inode *dir, struct dentry *dentry);
Эта функция вызывается из системного вызова
rmdir
для удаления каталога на который указывает элемент каталога
dentry
из каталога
dir
.
•
int mknod(struct inode *dir, struct dentry *dentry,