Объект superblock

Объект superblock

Объект суперблок должен быть реализован для каждой файловой системы. Он используется для хранения информации, которая описывает определенную файловую систему. Этот объект обычно соответствует суперблоку (superblock) или управляющему блоку (control block) файловой системы, который хранится в специальном секторе диска (отсюда и имя объекта). Файловые системы, которые не располагаются на дисках (например, файловые системы в виртуальной памяти, как sysfs), генерируют информацию суперблока "на лету" и хранят в памяти.

Объект суперблок представляется с помощью структуры struct super_block, которая определена в файле <linux/fs.h>. Она выглядит следующим образом (комментарии описывают назначение каждого поля).

struct super_block {

 struct list_head         s_list;           /* список всех суперблоков */

 dev_t                    s_dev;            /* идентификатор */

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

 unsigned long            s_old_blocksize;  /* старый размер блока

                                               в байтах */

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

 unsigned char            s_dirt;           /* флаг того,

                                               что суперблок изменен */

 unsigned long long       s_maxbytes; /* максимальный размер файла */

 struct file_system_type  *s_type;          /* тип файловой системы */

 struct super_operations  *s_op;            /* операции суперблока */

 struct dquot_operations  *dq_op;           /* операции с квотами */

 struct quotactl_ops      *s_qcop; /* операции управления квотами */

 struct export_operations *s_export_op;     /* операции экспортирования */

 unsigned long            s_flags;          /* флаги монтирования */

 unsigned long            s_magic; /* магический номер файловой системы */

 struct dentry            *s_root; /* каталог, точка монтирования */

 struct rw_semaphore      s_umount;         /* семафор размонтирования */

 struct semaphore         s_lock;           /* семафор суперблока */

 int                      s_count; /* счетчик ссылок на суперблок */

 int                      s_syncing;        /* флаг синхронизации

                                               файловой системы */

 int                      s_need_sync_fs; /* флаг того, что файловая

                                       система еще не синхронизирована */

 atomic_t                 s_active;         /* счетчик активных ссылок */

 void                     *s_security;      /* модуль безопасности */

 struct list_head         s_dirty; /* список измененных индексов */

 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(). Эта функция вызывается при монтировании файловой системы, которая считывает суперблок файловой системы с диска и заполняет поля объекта суперблок.