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 для получения статистики файловой системы, Статистика указанной файловой системы записывается в структуру