u32 b_size; /* размер блока (в байтах) */
char *b_data; /* указатель на буфер в странице памяти */
struct block_device *b_bdev; /* соответствующее блочное устройство */
bh_end_io_t *b_end_io; /* метод завершения ввода-вывода */
void *b_private; /* данные метода завершения */
struct list_head b_assoc_buffers; /* список связанных отображений */
};
Поле b_state
bh_state_bits, которое описано в файле .Таблица 13.1
. Значения флагов поляbh_state| Флаг состояния | Назначение |
|---|---|
BH_Uptodate | Буфер содержит действительные данные |
BH_Dirty | Буфер изменен (содержимое буфера новее соответствующих данных на диске, и поэтому буфер должен быть записан на диск) |
BH_Lock | Для буфера выполняется операция чтения-записи дисковых данных, и буфер заблокирован, чтобы предотвратить конкурентный доступ |
BH_Req | Буфер включен в запрос |
BH_Mapped | Буфер является действительным и отображается на дисковый блок |
BH_New | Буфер только что выделен и к нему еще не было доступа |
BH_Async_Read | Для буфера выполняется асинхронная операция чтения |
BH_Async_Write | Для буфера выполняется асинхронная операция записи |
BH_Delay | С буфером еще не связан дисковый блок |
BH_Boundary | Буфер является последним в последовательности смежных блоков — следующий за ним блок не является смежным с этой серией |
Перечисление bh_state_bits
BH_PrivateStart. Этот флаг не является разрешенным значением флага, а соответствует первому биту, который можно использовать по усмотрению разработчиков кода. Все биты, номер которых больше или равен значению BH_PrivateStart, не используются подсистемой блочного ввода-вывода и безопасно могут использоваться драйверами, которым необходимо хранить информацию в поле b_state.Флаги, которые используются драйверами, могут быть определены на основании значения этого флага, что позволяет гарантированно избежать перекрытия с битами, которые официально используются уровнем блочного ввода-вывода.
Поле b_count
следующим образом.static inline void get_bh(struct buffer_head *bh) {
atomic_inc{&bh->b_count);
}
static inline void put_bh(struct buffer_head *bh) {
atomic_dec(&bh->b_count);
}
Перед тем как манипулировать заголовком буфера, необходимо увеличить значение счетчика использования с помощью функции get_bh()
put_bh().Физический блок на жестком диске, которому соответствует буфер, — это блок с логическим номером b_blocknr
b_bdev.Физическая страница памяти, в которой хранятся данные буфера, соответствует значению поля b_page
b_data — это указатель прямо на данные блока (которые хранятся где-то в странице памяти b_page), размер блока хранится в поле b_size. Следовательно, блок хранится в памяти, начиная с адреса b_data и заканчивая адресом (b_data + b_size).