unsigned char i_sock; /* сокет или нет? */
atomic_t i_writecount; /* счетчик использования
для записи */
void *i_security; /* модуль безопасности */
__u32 i_generation; /* номер версии индекса */
union {
void *generic_ip; /* специфическая информация
файловой системы */
} u;
};
Для каждого файла в системе существует представляющий его индекс (хотя объект файлового индекса создается в памяти только тогда, когда к файлу осуществляется доступ). Это справедливо и для специальных файлов, таких как файлы устройств или конвейеры. Следовательно, некоторые из полей структуры 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
определена в файле
, как показано ниже.
struct inode_operations {
int (*create)(struct inode*, struct dentry*, int);
struct dentry* (*lookup)(struct inode*, struct dentry*);
int (*link)(struct dentry*, struct inode*, struct dentry*);
int (*unlink)(struct inode*, struct dentry*);
int (*symlink)(struct inode*, struct dentry*, const char*);
int (*mkdir)(struct inode*, struct dentry*, int);
int (*rmdir)(struct inode*, struct dentry*);
int (*mknod)(struct inode*, struct dentry*, int, dev_t);
int (*rename)(struct inode*, struct dentry*,
struct inode*, struct dentry*);
int (*readlink)(struct dentry*, char*, int);
int (*follow_link)(struct dentry*, struct nameidata*);
int (*put_link)(struct dentry*, struct nameidata*);
void (*truncate)(struct inode*);
int (*permission)(struct inode*, int);
int (*setattr)(struct dentry*, struct iattr*);
int (*getattr)(struct vfsmount*, struct dentry*, struct kstat*);
int (*setxattr)(struct dentry*, const char*,
const void*, size_t, int);
ssize_t (*getxattr)(struct dentry*, const char*, void*, size_t);
ssize_t (*listxattr)(struct dentry*, char*, size_t);
int (*removexattr)(struct dentry*, const char*);
};
Рассмотрим указанные операции более подробно.
• int create(struct inode *dir, struct dentry *dentry, int mode);
Эта функция вызывается подсистемой VFS из системных вызовов creat()
и open()
для создания нового файлового индекса, который имеет указанный режим доступа (mode
) и связан с указанным элементом каталога (dentry
).