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


Индексный дескриптор

Вся информация, необходимая файловой системе для работы с файлом, находится в структуре данных, называемой индексным дескриптором. Имя файла— это произвольно выбранная метка, которая может измениться, а индексный дескриптор уникален для каждого файла и остается неизменным все то время, что файл существует. Объект индексный дескриптор”, расположенный в памяти, представляет собой структуру inode
Каждый объект "индексный дескриптор” дублирует некоторые данные, содержащиеся в индексном дескрипторе на диске, например, количество блоков, выделенных под файл. Когда значение поля i state равно i dirty sync,
I DIRTY DATASYNC ИЛИ I DIRTY PAGES, ИНДеКСНЫЙ ДеСКрИПТОр ЯВЛЯеТСЯ "грЯЗ- ным", т. е. соответствующий индексный дескриптор на диске должен быть
обновлен. Макрос i dirty может быть использован для проверки сразу всех этих трех флагов. Кроме того, поле i state может принимать значения: i lock (объект индексный дескриптор” участвует в операции ввода/вывода), i freeing (объект индексный дескриптор” освобождается), i clear (содержимое объекта индексный дескриптор” утратило смысл) и i new (объект индексный дескриптор” создан, но еще не заполнен данными из индексного дескриптора, хранящегося на диске).
Каждый объект индексный дескриптор” обязательно присутствует в одном из следующих циклических двунаправленных списков (и во всех случаях указатели на соседние элементы хранятся в поле iiist):
- список допустимых свободных индексных дескрипторов, как правило, тех, которые отражают индексный дескриптор на диске и не используются в данный момент ни одним процессом. Эти индексные дескрипторы не являются грязными”, а их поля i count установлены в ноль. На первый и последний элементы этого списка указывают соответственно поля next и prev переменной inode unused. Этот список используется как кэш диска;
- список используемых индексных дескрипторов, т. е. тех, которые отражают индексный дескриптор на диске и используются в каких-то процессах. Эти индексные дескрипторы не являются грязными”, а их поля i count имеют положительные значения. На первый и последний элементы указывает переменная inode_in_use;
- список грязных” индексных дескрипторов. На первый и последний элементы указывает поле s dirty соответствующего суперблока.
Каждый из упомянутых списков связывает поля i iist соответствующих объектов индексный дескриптор”.
Кроме того, каждый объект индексный дескриптор” также включен в некий циклический двунаправленный список, который имеется в каждой файловой системе и на который указывает поле s inodes объекта суперблок”. При этом поле i sb iist объекта индексный дескриптор” содержит указатели на соседние элементы этого списка.
Наконец, объекты индексный дескриптор” содержатся в хеш-таблице по имени inode hashtabie. Эта таблица ускоряет поиск объекта индексный дескриптор”, когда ядру известны как номер индексного дескриптора, так и адрес суперблока, соответствующего файловой системе, в которой находится данный файл. Поскольку хеширование может привести к коллизиям, объект индексный дескриптор” имеет поле i hash, содержащее указатели на последующий и предыдущий индексные дескрипторы, хешированные в ту же позицию. Таким образом, это поле создает двунаправленный список этих индексных дескрипторов.
Методы, связанные с объектом "индексный дескриптор”, называются операциями индексного дескриптора. Они описаны в структуре inode operations,
адрес которой хранится в поле i_op. Далее приводится список операций индексного дескриптора в том порядке, в каком они перечислены в таблице
inode_operations:
- create (dir, dentry, mode, nameidata) — создает НОВЫЙ индексный деск- риптор на диске для обычного файла, связанного с объектом элемент каталога” в указанном каталоге;
- lookup (dir, dentry, nameidata) — ищет В каталоге индексный дескрип- тор, соответствующий имени файла в объекте элемент каталога”;
- link (old_dentry, dir, new_dentry) — СОЗДаеТ НОВую жесткую ССЫЛКу на файл, указанный в параметре oid dentry и расположенный в каталоге dir. Имя новой жесткой ссылки указано в параметре new dentry;
- unlink (dir, dentry) — удаляет жесткую ссылку на файл, определяемый объектом элемент каталога” и расположенный в указанном каталоге;
- symlink (dir, dentry, symname) — СОЗДаеТ НОВЫЙ индексный дескриптор для символьной ссылки, связанной с объектом элемент каталога” в указанном каталоге;
- mkdir (dir, dentry, mode) — СОЗДаеТ НОВЫЙ индексный дескриптор ДЛЯ каталога, связанного с объектом элемент каталога” в указанном каталоге;
- rmdir (dir, dentry) — удаляет из каталога подкаталог, имя которого содержится в объекте элемент каталога”;
- mknod (dir, dentry, mode, rdev) — СОЗДаеТ НОВЫЙ индексный дескриптор на диске для специального файла, связанного с объектом элемент каталога” в указанном каталоге. Параметры mode и rdev указывают, соответственно, тип файла и старший и младший номера устройства;
- rename (old_diг, old_dentry, new_dir, new_dentry) — переносит файл, идентифицируемый параметром oid dentry, из каталога oid dir в каталог new dir. Новое имя файла содержится в объекте элемент каталога”, на который указывает параметр new dentry;
- readlink (dentry, buffer, buflen) — копирует путь К файлу, COOTBeTCT- вующий символьной ссылке, указанной элементом каталога, в область памяти пространства пользователя, указанную параметром buffer;
- follow link (inode, nameidata) — транслирует СИМВОЛЬНУЮ ССЫЛКу, указанную объектом индексный дескриптор”. Если эта ссылка является относительным путем, операция просмотра начинается с каталога, указанного во втором параметре;
- put_iink (dentry, nameidata) — освобождает все временные структуры данных, выделенные методом foiiow iink для трансляции символьной ссылки;
- truncate (inode) — изменяет размер файла, связанного с индексным дескриптором. До вызова этого метода необходимо записать в поле i size объекта "индексный дескриптор” новый размер файла;
- permission (inode, mask, nameidata)—проверяет, разрешен ли указанный режим доступа для файла, связанного с индексным дескриптором;
- setattr (dentry, iattr) — возбуждает событие изменено” после установки атрибутов индексного дескриптора;
- getattr (mnt, dentry, kstat) — ИСПОЛЬЗуеТСЯ В некоторых фаЙЛОВЫХ СИС- темах для чтения атрибутов индексного дескриптора;
- setxattr (dentry, name, value, size, flags) —устанавливаетрасширенный атрибут” индексного дескриптора (расширенные атрибуты хранятся в блоках диска за пределами любого индексного дескриптора);
- getxattr (dentry, name, buffer, size) — Читает расширенный атрибут индексного дескриптора;
- listxattr (dentry, buffer, size) — читает полный список имен расширенных атрибутов;
- removexattr (dentry, name) —удаляет расширенный атрибут.
Перечисленные методы доступны всем индексным дескрипторам во всех допустимых файловых системах, однако в каждой конкретной файловой системе имеется лишь какое-то их подмножество, а поля, соответствующие нереализованным методам, установлены в null.

Предыдущая страница | 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




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

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

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

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

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

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

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

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

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