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

ЖАНРЫ

Разработка ядра Linux (Второе издание)
Шрифт:

 void (*read_inode)(struct inode*);

 void (*dirty_inode)(struct inode*);

 void (*write_inode)(struct inode*, int);

 void (*put inode)(struct inode*);

 void (*drop_inode)(struct inode*);

 void (*delete_inode)(struct inode*);

 void (*put_super)(struct super_block*);

 void (*write_super)(struct super block*);

 int (*sync_fs)(struct super_block*, int);

 void (*write_super_lockfs)(struct super_block*);

 void (*unlockfs)(struct super_block*);

 int (*statfs)(struct super_block*, struct statfs*);

 int (*remount_fs)(struct super_block*, int*, char*);

 void (*clear_inode)(struct inode*);

 void (*umount_begin)(struct super block*);

 int (*show_options)(struct seq_file*, struct vfsmount*);

};

Каждое

поле этой структуры представляет собой указатель на функцию, которая работает с объектом суперблок. Операции суперблока выполняют низкоуровневые действия с файловой системой и ее файловыми индексами.

Когда для файловой системы необходимо выполнить операции с суперблоком, то выполняется разыменование указателя на суперблок, и далее получается указатель на необходимый метод. Например, если файловой системе необходимо записать суперблок, то вызывается следующая функция.

sb->s_op->write_super(sb);

где параметр sb — это указатель на суперблок файловой системы. Следуя по указателю

s_op
, получаем таблицу операций суперблока и, наконец, необходимую функцию
write_super
, которая вызывается непосредственно. Следует обратить внимание на то, что вызову функции
write_super
необходимо передать указатель на суперблок в качестве параметра, несмотря на то что метод связан с суперблоком. Это происходит от того, что язык программирования С не объектно-ориентирован. В C++ аналогичный вызов может быть выполнен следующим образом.

sb.write_super;

В языке С нет простого способа получить указатель на объект, для которого вызван метод, поэтому его необходимо передавать явно.

Рассмотрим операции суперблока, которые описаны в структуре

super_operations
.

• 

struct inode* alloc_inode(struct super_block *sb)
эта функция создает и инициализирует новый объект файлового индекса, связанного с данным суперблоком.

• 

void destroy_inode(struct inode *inode)
— эта функция уничтожает данный объект индекса файла.

• 

void read_inode(struct inode *inode)
— эта функция считывает с диска файловый индекс с номером
inode->i_ino
и заполняет все остальные поля структуры данных индекса.

• 

void dirty_inode(struct inode *inode)
— эта функция вызывается подсистемой VFS, когда в индекс вносятся изменения (dirty). Журналируемые файловые системы (как, например, ext3) используют эту функцию для обновления журнала.

• 

void write_inode(struct inode inode*, int wait)
— эта функция записывает указанный индекс на диск. Параметр
wait
указывает, должна ли данная операция выполняться синхронно.

• 

void put_inode(struct inode *inode)
— эта функция освобождает указанный индекс.

• 

void drop_inode(struct inode *inode)
— эта функция вызывается подсистемой VFS, когда исчезает последняя ссылка на индекс. Обычные файловые системы Unix никогда не определяют эту функцию, в таком случае подсистема VFS просто удаляет индекс. Вызывающий код должен удерживать блокировку
inode_lock
.

• 

void delete_inode(struct inode *inode)
эта функция удаляет индекс файла с диска.

void put_super(struct super_block *sb)
— эта функция вызывается подсистемой VFS при размонтировании файловой системы, чтобы освободить указанный суперблок.

• 

void write_super(struct super_block *sb)
— эта функция обновляет суперблок на диске данными из указанного суперблока. Подсистема VFS вызывает эту функцию для синхронизации измененного суперблока в памяти с данными суперблока на диске.

• 

int sync_fs(struct super_block *sb, int wait)
— эта функция синхронизирует метаданные файловой системы с данными на диске. Параметр
wait
указывает, должна ли операция быть синхронной или асинхронной.

• 

void write_super_lockfs(struct super_block *sb)
— эта функция предотвращает изменения файловой системы и затем обновляет данные суперблока на диске данными из указанного суперблока. Сейчас она используется диспетчером логических томов (LVM, Logical Volume Manager).

• 

void unlockfs(struct super_block *sb)
— эта функция разблокирует файловую систему после выполнения функции
write_super_lockfs
.

• 

int statfs(struct super_block *sb, struct statfs *statfs)
— эта функция вызывается подсистемой VFS для получения статистики файловой системы, Статистика указанной файловой системы записывается в структуру
statfs
.

• 

int remount_fs(struct super_block *sb, int *flags, char *data)
— эта функция вызывается подсистемой VFS, когда файловая система монтируется с другими параметрами монтирования.

• 

void clear_inode(struct inode*)
— эта функция вызывается подсистемой VFS для освобождения индекса и очистки всех страниц памяти, связанных с индексом.

• 

void umount_begin(struct super_block *sb)
— эта функция вызывается подсистемой VFS для прерывания операции монтирования. Она используется сетевыми файловыми системами, такими как NFS.

Все рассмотренные функции вызываются подсистемой VFS в контексте процесса. Все они при необходимости могут блокироваться.

Некоторые из этих функций являются необязательными. Файловая система может установить их значения в структуре операций суперблока равными

NULL
. Если соответствующий указатель равен
NULL
, то подсистема VFS или вызывает общий вариант функции, или не происходит ничего, в зависимости от операции.

Объект inode

Объект

inode
содержит всю информацию, которая необходима ядру для манипуляций с файлами и каталогами. В файловых системах в стиле Unix вся информация просто считывается из дисковых индексов и помещается в объект
inode
подсистемы VFS. Если файловые системы не имеют индексов, то эту информацию необходимо получить из других дисковых структур [70] .

Объект индекса файла представляется с помощью структуры

struct inode
, которая определена в файле
<linux/fs.h>
. Эта структура с комментариями, описывающими назначение каждого поля, имеет следующий вид.

70

Файловые системы, которые не имеют индексов, обычно хранят необходимую информацию как часть файла. Некоторые современные файловые системы также применяют базы данных для хранения метаданных файла. В любом случае объект индекса создается тем способом, который подходит для файловой системы.

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