Обращение к блочному устройству
Когда ядро получает запрос на открытие файла блочного устройства, оно должно вначале определить, открыт ли этот файл. Дело в том, что если он уже открыт, ядру не нужно создавать и инициализировать новый дескриптор блочного устройства. Вместо этого ему будет достаточно обновить уже существующий. Ситуация усложняется тем, что файлы блочных устройств с одинаковыми старшими и младшими номерами, но разными путями, воспринимаются виртуальной файловой системой как разные файлы, хотя относятся к одному блочному устройству. Следовательно, ядро не может определить, используется ли блочное устройство, путем простой проверки наличия объекта для файла устройства в кэше индексных дескрипторов.
Соответствие старшего и младшего номеров дескриптору блочного устройства поддерживается с помощью файловой системы bdev. Каждый дескриптор блочного устройства связан со специальным файлом этой системы: поле bd inode дескриптора указывает на соответствующий индексный дескриптор в bdev; и, наоборот, этот индексный дескриптор кодирует старший и младший номера блочного устройства, а также адрес его дескриптора.
Функция beiget принимает в качестве параметра старший и младший номера блочного устройства и ищет в файловой системе bdev ассоциированный индексный дескриптор. Если таковой не находится, функция выделяет новый индексный дескриптор и новый дескриптор блочного устройства. В любом случае функция возвращает адрес дескриптора блочного устройства, соответствующего указанным старшему и младшему номерам.
После того, как дескриптор для данного блочного устройства найден, ядро может определить, используется ли блочное устройство в данный момент. Для этого ядро проверяет значение поля bd openers: если оно положительно, значит, блочное устройство используется (возможно, при посредстве другого файла устройства). Кроме того, ядро поддерживает список индексных дескрипторов, относящихся к открытым файлам блочных устройств. Корень этого списка находится в поле bd inodes дескриптора блочного устройства, а поле i devices индексного дескриптора содержит указатели на предыдущий и следующий элементы этого списка.
Предыдущая страница | 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 | Следующая страница