Чтение онлайн

ЖАНРЫ

Разработка ядра Linux
Шрифт:

struct inode {

 struct hlist_node i_hash; /* хешированный список */

 struct list_head i_list; /* связанный список индексов */

 struct list_head i_dentry; /* связанный список объектов dentry */

 unsigned long i_ino; /* номер индекса */

 atomic_t i_count; /* счетчик ссылок */

 umode_t i_mode; /* права доступа */

 unsigned int i_nlink; /* количество жестких ссылок */

 uid_t i_uid; /*
идентификатор пользователя-владельца */

 gid_t i_gid; /* идентификатор группы-владельца */

 kdev_t i_rdev; /* связанное устройство */

 loff_t i_size; /* размер файла в байтах */

 struct timespec i_atime; /* время последнего доступа к файлу */

 struct timespec i_mtime; /* время последнего изменения файла */

 struct timespec i_ctime; /* время изменения индекса */

 unsigned int i_blkbits; /* размер блока в битах */

 unsigned long i_blksize; /* размер блока в байтах */

 unsigned long i_version; /* номер версии */

 unsigned long i_blocks; /* размер файла в блоках */

 unsigned short i_bytes; /* количество использованных байтов */

 spinlock_t i_lock; /* блокировка для защиты полей */

 struct rw_semaphore i_alloc_sem /* вложенные блокировки при

захваченной i_sem */

 struct semaphore i_sem; /* семафор индекса */

 struct inode_operations *i_op; /* таблица операций с индексом */

 struct file_operations *i_fop; /* файловые операции */

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

 struct file_lock *i_flock; /* список блокировок файлов */

 struct address_space *i_mapping; /* соответствующее адресное

пространство */

 struct address_space i_data; /* адресное пространство устройства */

 struct dquot *i_dquot[MAXQUOTAS]; /* дисковые квоты

для индекса */

 struct list_head i_devices; /* список блочных устройств */

 struct pipe_inode_info *i_pipe; /* информация конвейера */

 struct block_device *i_bdev; /* драйвер блочного устройства */

 unsigned long i_dnotify_mask; /* события каталога */

 struct dnotify_struct *i_dnotify; /* информация о событиях каталога */

 unsigned long i_state; /* флаги состояния */

 unsigned long dirtied_when /* время первого изменения */

 unsigned int i_flags; /* флаги файловой системы */

 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
определена в файле
<linux/fs.h>
, как показано ниже.

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);

Поделиться с друзьями: