struct list_head s_io; /* список обратной записи */
struct hlist_head s_anon; /* анонимные элементы каталога
для экспортирования */
struct list_head s_files; /* список связанных файлов */
struct block_device *s_bdev; /* соответствующий драйвер
блочного устройства */
struct list_head s_instances; /* список файловых систем
данного типа */
struct quota_info s_dquot; /* параметры квот */
char s_id[32]; /* текстовое имя */
void *s_fs_info; /* специфическая информация
файловой системы */
struct semaphore s_vfs_rename_sem; /* семафор переименования */
};
Код для создания, управления и ликвидации объектов суперблок находится в файле fs/super.c
. Объект alloc_super()
. Эта функция вызывается при монтировании файловой системы, которая считывает суперблок файловой системы с диска и заполняет поля объекта
Операции суперблока
Наиболее важный элемент суперблока — это поле s_op
, которое является указателем на таблицу операций суперблока. Таблица операций суперблока представлена с помощью структуры struct super_operations
, которая определена в файле
. Она выглядит следующим образом.
struct super_operations {
struct inode *(*alloc_inode)(struct super_block *sb);
void (*destroy_inode)(struct inode*);
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
.