Удаление индексных дескрипторов
Функция ext2_free inode удаляет индексный дескриптор, представленный объектом индексный дескриптор”, адрес которого, inode, она получает в качестве параметра. Ядро должно вызвать эту функцию после ряда заключительных операций, затрагивающих внутренние структуры и данные в самом файле. Функция вызывается после удаления объекта индексный дескриптор” из хеш-таблицы, после удаления последней жесткой ссылки на этот индексный дескриптор из каталога и после усечения файла до нулевой длины с целью утилизации всех его блоков
Функция выполняет следующие действия:
1. Вызывает функцию ciear inode , которая выполняет следующее:
• удаляет все грязные” косвенные буферы, ассоциированные с этим индексным дескриптором Они собраны в списке, голова которого находится в поле
private_list объекта address_space ПО адресу inode->i_data
• если флаг i lock индексного дескриптора установлен, значит, некоторые буферы индексного дескриптора вовлечены в операцию ввода/вывода. В таком случае функция приостанавливает текущий процесс, пока не завершится эта операция;
• вызывает метод ciear inode объекта-суперблока, если он определен. Сама файловая система Ext2 этот метод не определяет;
• если индексный дескриптор ссылается на файл устройства, функция удаляет объект индексный дескриптор” из списка индексных дескрипторов, принадлежащего этому устройству. Этот список имеет корень либо в поле list дескриптора символьного устройства Cdev либо в поле bdinodes дескриптора блОЧНОГО устройства blockdevice
• устанавливает состояние индексного дескриптора в значение i clear (содержимое этого объекта больше не имеет смысла).
2. Вычисляет индекс группы блоков, содержащей индексный дескриптор на
диске, по номеру индексного дескриптора и количеству индексных дескрипторов в каждой группе блоков.
3. Вызывает функцию read inode bitmap , чтобы получить битовую карту индексных дескрипторов.
4. Увеличивает значение в поле bg_free_inodes_count дескриптора группы. Если удаляемый индексный дескриптор соответствует каталогу, функция уменьшает значение поля bg used dirs count. Затем функция помещает буфер, содержащий дескриптор группы, как "грязный”.
5. Если удаляемый индексный дескриптор соответствует каталогу, функция уменьшает значение поля s dirs counter структуры ext2_sb_info, устанавливает флаг s dirt суперблока в единицу и помечает буфер, содержащий суперблок, как грязный”.
6. Сбрасывает бит, соответствующий индексному дескриптору на диске, в битовой карте индексных дескрипторов и помечает буфер, содержащий ее, как грязный”. Кроме того, если файловая система была смонтирована С флагом MS SYNCHRONIZE, фуНКЦИЯ ВЫЗЫВаеТ функцию sync dirty buffer и ждет завершения операции записи буфера, содержащего битовую карту.
Предыдущая страница | 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 | Следующая страница