Передача голов буферов общему слою работы с блочными устройствами
Пара функций, submit bho и ii_rw_biock, позволяет ядру запустить операцию ввода/вывода для одного или нескольких буферов, описываемых их головами.
Функция submit_bh
Чтобы передать общему слою работы с блочными устройствами одну голову буфера и тем самым запросить передачу одного блока данных, ядро вызывает функцию submit bh . Ее параметрами являются направление движения данных (read или write) и указатель bh на голову буфера, описывающую буфер блока.
Функция submit bh предполагает, что голова буфера полностью инициализирована. В частности, ПОЛЯ b_bdev, b blocknr И b size ДОЛЖНЫ идентифици- ровать блок на диске, содержащий запрошенные данные. Если буфер блока принадлежит странице буферов блочного устройства, инициализация головы буфера выполняется функцией find get biock , как описано в предыдущем разделе. Однако, как мы увидим в следующей главе, функция submit bh может быть также вызвана для блоков, принадлежащих страницам буферов, которыми владеют обычные файлы.
Функция submit bh представляет собой нечто большее, чем просто "склеивающая” функция, которая создает запрос bio на основании содержимого головы буфера и затем вызывает generic make request
Основные действия, выполняемые ею, таковы:
1. Устанавливает флаг BH Req головы буфера, чтобы отметить, что блок был передан, как минимум, один раз. Кроме того, если направление движения
ДаННЫХ WRITE, фуНКЦИЯ сбрасывает флаг BH_Write_EIO.
2. Вызывает bio aiiocO для выделения нового дескриптора bio
3. Инициализирует поля дескриптора bio в соответствии с содержимым головы буфера:
• записывает в поле bi sector номер первого сектора в блоке (bh-> b_blocknr bh->b_size / 512);
• записывает в поле bi bdev адрес дескриптора блочного устройства
(bh->b_bdev);
• записывает в поле bi size размер блока (bh->b_size);
• инициализирует первый элемент массива bi io vec так, чтобы сегмент соответствовал буферу блока. В bi_io_vec[0] .bv page записывается
bh->b_page, В bi_io_vec[0] .bv_len записывается bh->b_size, а В bi_io_ vec [0] .bv offset записывается смещение буфера блока в странице, указанное В bh->b_data;
• записывает единицу в bi vcnt (только один сегмент в bio) и ноль в bi idx (передается текущий сегмент);
• записывает В поле bi_end_io адрес end_bio_bh_io_sync(), а в поле bi private — адрес головы буфера. Функция будет вызвана, когда пересылка данных завершится.
4. Увеличивает счетчик ссылок bio (он становится равным 2).
5. Вызывает функцию submit bio (), которая устанавливает флаг bi rw в соответствии с направлением пересылки данных, обновляет переменную page states (свою у каждого процессора), чтобы отслеживать количество прочитанных и записанных секторов, и вызывает функцию generic_ таke_request ДЛЯ Дескриптора bio.
6. Уменьшает счетчик обращений к bio.
7. Дескриптор bio не освобождается, потому что он заносится в очередь планировщика ввода/вывода.
8. Возвращает 0 (успех).
Когда ввод/вывод bio заканчивается, ядро вызывает метод bi end io. В данном случае это функция end bio bh io sync . Она читает адрес головы буфера из поля bi private структуры bio, затем вызывает метод b end io головы буфера (он был корректно установлен до вызова функции submit bh ) и, наконец, вызывает bio put , чтобы уничтожить структуру bio.
Предыдущая страница | 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 | Следующая страница