Linux Kernel (Ядро линукса) (часть 3)


Как ведется журнал

В этом разделе мы на примере продемонстрируем, как ведется журнал. Предположим, слой файловой системы Ext3 принимает запрос на запись нескольких блоков обычного файла.

Как нетрудно догадаться, мы не собираемся подробно описывать каждую операцию слоя файловой системы Ext3 и слоя блочного устройства, ведущего журнал. Нам пришлось бы затронуть слишком много моментов! Мы просто опишем самые важные действия:
1. Служебная процедура системного вызова write о запускает метод write файлового объекта, ассоциированного с обычным файлом Ext3. В файловой системе Ext3 ЭТОТ метод реализован функцией generic_file_write, которая была описана в разд. "Запись в файл " в главе 16.
2. Функция generic fiie write о несколько раз вызывает метод prepare write объекта address space, по разу для каждой страницы дан- ных, вовлеченной в операцию записи. В Ext3 этот метод реализован функцией ext3_prepare_write.
3. Функция ext3_prepare_write о запускает новую атомарную операцию, вызвав функцию journai start о слоя журналирующего блочного устройства. Пакет добавляется к активной транзакции. На самом деле, пакет атомарных операций создается только при первом вызове функции journai start о. При следующих вызовах функция убеждается, что поле journai info дескриптора процесса уже содержит осмысленную информацию, и обращается к пакету, на который ссылается поле.
4. ФуНКЦИЯ ext3_prepare_write ВЫЗЫВает фуНКЦИЮ block prepare write , описанную в главе 16, передавая ей адрес функции ext3_get_biock. Вспомним, что функция block prepare write о отвечает за подготовку буферов и их голов для страницы файла.
5. Когда ядро должно определить логический номер блока в файловой системе Ext3, оно выполняет функцию ext3_get_biock. Эта функция аналогична функции ext2_get_biock , описанной в разд. "Выделение блока данных" ранее в этой главе. Однако важное отличие файловой системы Ext3 состоит в том, что она вызывает функции слоя журналирующего
блочного устройства, чтобы гарантировать занесение в журнал операций низкого уровня:
• до запуска низкоуровневой операции записи блока метаданных файловой системы функция вызывает функцию ext3_prepare_write . В принципе, вызванная функция добавляет буфер с метаданными в список активной транзакции, но она также должна проверить, включены ли эти метаданные в какую-нибудь старую незавершенную транзакцию журнала. Если это так, функция создает копию буфера, чтобы старые транзакции выполнялись со старым содержимым;
• после обновления буфера с блоком метаданных файловая система Ext3 вызывает функцию journai get write access о, чтобы перенести буфер с метаданными в список "грязных” буферов транзакции и записать операцию в журнал.
Обратите внимание, что буферы с метаданными, обрабатываемые слоем журналирующего блочного устройства, обычно не содержатся в списках "грязных” буферов индексного дескриптора и поэтому не записываются на диск обычными механизмами записи кэша,
6. Если файловая система Ext3 была смонтирована для работы в режиме "Журнал”, функция ext3_prepare_write о вызывает также функцию journai get write access о для каждого буфера, затронутого операцией записи.
7. Управление возвращается функции generic file write о, которая обновляет страницу с данными, хранящуюся в адресном пространстве режима пользователя, а затем вызывает метод commit_write объекта address space. В файловой системе Ext3 выбор функции, реализующей этот метод, зависит от того, как была смонтирована Ext3:
• если файловая система Ext3 была смонтирована в режиме "Журнал”, метод commit_write реализуется функцией ext3_journalled_commit_ write о, которая вызывает функцию journal_dirty_metadata ДЛЯ каждого буфера данных (не метаданных) на странице. Таким образом, буфер включается в список грязных” буферов активной транзакции, а не в список индексного дескриптора; при этом соответствующие журнальные записи заносятся в журнал. В конце работы функция ext3_journalled_commit_write вызывает функцию journal_stop , чтобы уведомить слой блочного устройства, ведущего журнал, о закрытии пакета атомарных операций;
• если файловая система Ext3 была смонтирована в режиме Упорядоченный”, метод commitwrite реализуется функцией ext3_ordered_ commit writeO, которая вызывает функцию journal dirty data о ДЛЯ каждого буфера данных на странице, чтобы включить его в соответст
вующий список активной транзакции. Слой журналирующего блочного устройства гарантирует, что все буферы в этом списке записываются на диск до буферов с метаданными, включенных в транзакцию. Никакие записи в журнал не заносятся. Далее функция ext3_ordered_ commit_write ВЫЗЫВает обычную фуНКЦИЮ generic_commit_write которая добавляет буферы с данными в список "грязных” буферов их владельца, т. е. индексного дескриптора. В конце работы функция ext3_ordered_coramit_write ВЫЗЫВает фуНКЦИЮ journai stopO, чтобы уведомить слой блочного устройства, ведущего журнал, о закрытии пакета атомарных операций;
• если файловая система Ext3 была смонтирована в режиме Запись на диск”, метод commitwrite реализуется функцией ext3_writeback_ commit_write, вызывающей обычную фуНКЦИЮ generic_commit_ write о которая добавляет буферы с данными в список грязных” буферов их владельца, т. е. индексного дескриптора. Затем функция ext3_writeback_commit_write ВЫЗЫВает фуНКЦИЮ journai stopO, чтобы уведомить слой блочного устройства, ведущего журнал, о закрытии пакета атомарных операций.
8. Здесь служебная процедура системного вызова write о заканчивает свою работу. Однако этого нельзя сказать про слой журналирующего блочного устройства. Через какое-то время журнальные записи нашей транзакции будут физически занесены в журнал, и она станет завершенной. Тогда будет вызвана функция journal_commit_transaction .
9. Если файловая система Ext3 была смонтирована в режиме Упорядоченный”, функция journai_commit_transaction запускает операцию ввода/вывода для всех буферов, включенных в список транзакции, и ждет завершения пересылки данных.
10. Функция journai_commit_transaction запускает операцию ввода/вывода для всех буферов с метаданными, включенных в список транзакции (а также для всех буферов с данными, если Ext3 была смонтирована в режиме Журнал”).

И. Периодически ядро активизирует проверку для каждой завершенной транзакции в журнале. Эта деятельность, в основном, сводится к проверке того, что все операции ввода/вывода, запущенные функцией journai_commit_transaction, закончились успешно. Если это так, транзакцию можно удалять из журнала.
Конечно, записи в журнале не имеют особого значения, пока не случится сбой системы. Только при рестарте системы программа e2fsck будет просматривать журнал файловой системы и заново запускать описанные в нем операции записи на диск, чтобы завершить транзакции.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...