struct bio_vec *bi_io_vec; /* массив структур bio_vec */
bio_end_io_t *bi_end_io; /* метод завершения ввода-вывода */
atomic_t bi_cnb; /* счетчик использования */
void *bi_private; /* поле для информации создателя */
bio_destructor_t *bi_destructor; /* деструктор */
};
Главное назначение структуры bio
bi_io_vecs, bi_vcnt и bi_idx.Поле bi_io_vecs
bio_vec. Эти структуры используются в качестве списка отдельных сегментов в соответствующей операции блочного ввода-вывода. Каждый экземпляр структуры bio_vec представляет собой вектор следующего вида: <страница памяти, смещение, размер>, который описывает определенный сегмент, соответственно страницу памяти, где этот сегмент хранится, положение блока — смещение внутри страницы — и размер блока. Массив рассмотренных векторов описывает весь буфер полностью. Структура bio_vec определена в файле следующим образом.struct bio_vec {
/* указатель на страницу физической памяти, где находится этот буфер */
struct page *bv_page;
/* размер буфера в байтах */
unsigned int bv_len;
/* смещение в байтах внутри страницы памяти, где находится буфер */
unsigned int bv_offset;
};
Для каждой операции блочного ввода-вывода создается массив из bi_vcnt
bio_vec, начало которого содержится в поле bi_io_vecs. В процессе выполнения операции блочного ввода-вывода поле bi_idx используется для указания на текущий элемент массива.В общем, каждый запрос на выполнение блочного ввода-вывода представляется с помощью структуры bio
bio_vec. Каждая из этих структур представляет собой вектор, который описывает положение в физической памяти каждого сегмента запроса. На первый сегмент для операции ввода-вывода указывает поле bi_io_vec. Каждый следующий сегмент следует сразу за предыдущим. Всего в массиве bi_vcnt сегментов. В процессе того, как уровень блочного ввода-вывода обрабатывает сегменты запроса, обновляется значение поля bi_idx, чтобы его значение соответствовало номеру текущего сегмента. На рис. 13.2 показана связь между структурами bio, bio_vec и page.Рис. 13.2
. Связь между структурамиstruct bio, struct bio_vec и struct pageПоле bi_idx
bio_vec в массиве, что позволяет уровню блочного ввода-вывода поддерживать частично выполненные операции блочного ввода-вывода. Однако более важное использование состоит в том, что драйверы таких устройств, как RAID (Redundant Array of Inexpensive/Independent Disks, массив недорогих/независимых дисковых устройств с избыточностью — специальный способ использования жестких дисков, при котором один логический том может быть распределен но нескольким физическим дискам для увеличения надежности или производительности), могут одну структуру bio, которая изначально была адресована одному устройству, разбивать на несколько частей, которые предназначаются различным дискам RAID массива. Все, что необходимо сделать драйверу RAID, это создать необходимое количество копий структуры bio, которая предназначалась одному устройству, и изменить для каждой копии значение поля bi_idx, чтобы оно указывало на ту часть массива, откуда каждый диск должен начать свою операцию ввода-вывода.Структура bio
bi_cnt. Когда значение этого поля становится равным нулю, структура удаляется, и занятая память освобождается. Следующие две функции позволяют управлять счетчиком использования.void bio_get(struct bio *bio);
void bio_put(struct bio *bio);