Інші об’єкти підсистеми VFS

Структури для VFS – це сама улюблена річ, і в цій підсистемі існують не тільки розглянуті структури, а й ще деякі Кожна зареєстрована файлова система представлена структурою file_system_type, Обєкти цього типу описують файлову систему і її властивості Більш того, кожна точка монтування предстаплена у вигляді структури vfsmount Ця структура містить інформацію про точку монтування, таку як її положення і прапори, з якими виконана операція монтування

І нарешті, кожен процес має три структури, які описують файлову систему і файли, повязані з процесом Це структури file_struct, fs_struc t і namespace

Далі в цій главі будуть розглядатися ці обєкти та їх роль у функціонуванні рівня VFS

Обєкт superblock

Обєктсуперблок повинен бути реалізований для кожної файлової системи Він використовується для зберігання інформації, яка описує певну файлову систему Цей обектобично відповідає СУПЕРБЛОК (superblock) або керуючому блоку (control block) файлової системи, який зберігається в спеціальному секторі диска (звідси й імя обєкта) Файлові системи, які не розташовуються на дисках

(Наприклад, файлові системи у віртуальній памяті, як sysfs), генерують інформацію суперблоку на льоту і зберігають у памяті

Обєктсуперблакпредставляється за допомогою структури struc t super_block, яка визначена у файлі Вона виглядає таким чином (коментарі описують призначення кожного поля)

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 unsigned long

s_flags

s_magic

/*

/ * Прапори монтування * /

магічний номер файлової системи * /

struct dentry

*s_root

/ * Каталог, точка монтування * /

struct rw_semaphore

s_umount

/ * Семафор размонтирования * /

struct semaphore

s_lock

/ * Семафор суперблоку * /

int

s_count

/ * Лічильник посилань на суперблок * /

int

s_syncing

/ * Прапор синхронізації файлової системи * /

int s_nesd_sync_fs / * Прапор того, що файлова

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

atomic_t void

struct list_head

s_active

*s_security

s_dirty

/ * Лічильник активних ссипок * /

/ * Модуль безпеки * /

/ * Список змінених індексів * /

struct list_head struct hlist_head

s_io

s_anon

/ * Список зворотного запису * /

/ * Анонімні елементи каталогу для експортування * /

struct list_head struct block_device

s_files

*s_bdev

&quot

/ * Список повязаних файлів * /

/ * Відповідний драйвер

блокового пристрою * /

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с Обєктсуперблок створюється і ініціалізується у функції alloc _ super () Ця функція викликається при монтуванні файлової системи, яка зчитує суперблок файлової системи з диска і заповнює поля обєктасуперблок

Операції суперблоку

Найбільш важливий елемент суперблоку – це поле s_op, яке є покажчиком на таблицю операцій суперблоку Таблиця операцій суперблоку представлена ​​за допомогою структури struc t 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-&gts_op-&gtwrite_super(sb)

де параметр sb – це покажчик на суперблок файлової системи Слідуючи за вказівником s_op, отримуємо таблицю операцій суперблоку і, нарешті, необхідну функцію write_supe r (), яка викликається безпосередньо Слід звернути увагу на те, що викличу функції write_supe r () необхідно передати покажчик на суперблок як параметр, незважаючи на те що метод повязаний з суперблоком Це відбувається від того, що мова програмування С не обєктно-орієнтований У C + + аналогічний виклик може бути виконаний таким чином

sbwrite_super()

У мові С немає простого способу отримати покажчик на обєкт, для якого викликаний метод, тому його необхідно передавати явно

Розглянемо операції суперблоку, які описані в структурі super_opera tions

• struc t inode * alloc_inod e (struc t super_bloc k * sb) – ця функція створює і ініціалізує новий обєкт файлового індексу, повязаного з даними суперблоком

• void destroy_inode (struc t inode * inode) – ця функція знищує даний обєкт індексу файлу

• void read_inode (struc t inode * inode) – ця функція зчитує з диска файловий індекс з номером inode-> i_in o і заповнює всі інші поля структури даних індексу

• void dirty_inod e (struc t inode * inode) – ця функція викликається підсистемою VFS, коли в індекс вносяться зміни (dirty) Журналіруемих файлові системи (як, наприклад, ext3) використовують цю функцію для оновлення журналу

• void write_inode (struc t inode inode *, in t wait) – ця функція записує вказаний індекс на диск Параметр wait вказує, чи повинна дана операція виконуватися синхронно

• void put_inod e (struc t inode * inode) – ця функція звільняє вказаний індекс

• void drop_inode (struc t inode * inode) – ця функція викликається підсистемою VFS, коли зникає остання посилання на індекс Звичайні файлові системи Unix ніколи не визначають цю функцію, у такому випадку підсистема VFS просто видаляє індекс Викликає код повинен удержіпать блокування inode_lock

• voi d delete_inod e (struc t inode * inode) – ця функція видаляє індекс файлу з диска

• void put_supe r (struc t super_block * sb) – ця функція викликається підсистемою VFS при раемонтірованіі файлової системи, щоб звільнити вказаний суперблок

• voi d write_supe r (struc t super_block * sb) – ця функція оновлює суперблок на диску даними із зазначеного суперблоку Підсистема VFS викликає цю функцію для синхронізації зміненого суперблоку в памяті з даними суперблоку на диску

• in t sync_fs (struc t super_block * sb, in t wait) – ця функція синхронізує метадані файлової системи з даними на диску Параметр wait вказує, чи повинна операція бути синхронною або асинхронної

• voi d write_super_lockf s (struc t super_block * sb) – ця функція запобігає зміни файлової системи і потім оновлює дані суперблоку на диску даними із зазначеного суперблоку Зараз вона використовується диспетчером логічних томів (LVM, Logical Volume Manager)

• void unlockfs (struc t super_block * sb) – ця функція розблокує файлову систему після виконання функції write_super_lock fs ()

• in t statfs (struc t super_block * sb, struc t statf s * statfs) – ця функція викликається підсистемою VFS для отримання статистики файлової системи, Статистика зазначеної файлової системи записується в структуру statfs

• in t remount_fs (struc t super_block * sb, in t * flags, char * data)-ця функція викликається підсистемою VFS, коли файлова система монтується з іншими параметрами монтування

• void clear_inod e (struc t inode *) – ця функція викликається підсистемою VFS для звільнення індексу і очищення всіх сторінок памяті, повязаних з індексом

• void umount_begin (struc t super_block * sb) – ця функція викликається підсистемою VFS для переривання операції монтування Вона використовується мережевими файловими системами, такими як NFS

Усі розглянуті функції викликаються підсистемою VFS в контексті процесу Всі вони при необхідності можуть блокуватися

Деякі з цих функцій є необовязковими Файлова система може встановити їх значення в структурі операцій суперблоку рівними NULL Якщо відповідний покажчик дорівнює NULL, то підсистема VFS або викликає загальний варіант функції, або не відбувається нічого, залежно від операції

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*