Краткая справка |
Предыдущая Содержание Следующая |
#include <linux/fs.h> int register_blkdev(unsigned int major, const char *name); int unregister_blkdev(unsigned int major, const char *name); register_blkdev регистрирует блочный драйвер в ядре и, при необходимости, получает старший номер. Драйвер может быть разрегистрирован с помощью unregister_blkdev. struct block_device_operations Структура, которая содержит большинство методов для блочных драйверов.
#include <linux/genhd.h> struct gendisk; Структура, которая описывает единственное блочное устройство в ядре. struct gendisk *alloc_disk(int minors); void add_disk(struct gendisk *gd); Функции, которые выделяют структуры gendisk и возвращают их в систему. void set_capacity(struct gendisk *gd, sector_t sectors); Сохраняет объём устройства (в секторах по 512 байт) в структуре gendisk. void add_disk(struct gendisk *gd); Добавляет в ядро диск. Как только эта функция вызвана, ваши методы диска могут быть использованы ядром. int check_disk_change(struct block_device *bdev); Функция ядра, которая проверяет смену носителя в данном дисковом накопителе и принимает необходимые меры по очистке при обнаружении таких изменений.
#include <linux/blkdev.h> request_queue_t blk_init_queue(request_fn_proc *request, spinlock_t *lock); void blk_cleanup_queue(request_queue_t *); Функции, которые занимаются созданием и удалением очередей блочного запроса. struct request *elv_next_request(request_queue_t *queue); void end_request(struct request *req, int success); elv_next_request получает следующий запрос от очереди запросов; end_request может быть использована в очень простых драйверах, чтобы отметить полное завершение (или частичное) запроса. void blkdev_dequeue_request(struct request *req); void elv_requeue_request(request_queue_t *queue, struct request *req); Функции, которые удаляют запрос из очереди и помещают его обратно в случае необходимости. void blk_stop_queue(request_queue_t *queue); void blk_start_queue(request_queue_t *queue); Если вам необходимо предотвратить дальнейшие вызовы вашего метода request, вызов blk_stop_queue выполняет этот трюк. Вызов blk_start_queue необходим, чтобы снова вызвать ваш метод request. void blk_queue_bounce_limit(request_queue_t *queue, u64 dma_addr); void blk_queue_max_sectors(request_queue_t *queue, unsigned short max); void blk_queue_max_phys_segments(request_queue_t *queue, unsigned short max); void blk_queue_max_hw_segments(request_queue_t *queue, unsigned short max); void blk_queue_max_segment_size(request_queue_t *queue, unsigned int max); blk_queue_segment_boundary(request_queue_t *queue, unsigned long mask); void blk_queue_dma_alignment(request_queue_t *queue, int mask); void blk_queue_hardsect_size(request_queue_t *queue, unsigned short max); Функции, которые устанавливают разные параметры очереди, управляющие тем, как создаются запросы для данного устройства; параметры описаны в разделе "Функции управления очередью".
#include <linux/bio.h> struct bio; Низкоуровневая структура, представляющая собой часть запроса блочного ввода/вывода. bio_sectors(struct bio *bio); bio_data_dir(struct bio *bio); Два макроса, которые дают размер и направление передачи, описываемой структурой bio. bio_for_each_segment(bvec, bio, segno); Псевдоуправляющая структура, использующая для прохода по сегментам, которые составляют структуру bio. char *__bio_kmap_atomic(struct bio *bio, int i, enum km_type type); void __bio_kunmap_atomic(char *buffer, enum km_type type); __bio_kmap_atomic может быть использована для создания виртуального адреса ядра для данного сегмента в структуре bio. Отображение должно быть отменено с помощью __bio_kunmap_atomic. struct page *bio_page(struct bio *bio); int bio_offset(struct bio *bio); int bio_cur_sectors(struct bio *bio); char *bio_data(struct bio *bio); char *bio_kmap_irq(struct bio *bio, unsigned long *flags); void bio_kunmap_irq(char *buffer, unsigned long *flags); Набор макросов доступа, которые предоставляют доступ к "текущему" сегменту в структуре bio. void blk_queue_ordered(request_queue_t *queue, int flag); int blk_barrier_rq(struct request *req); Вызывайте blk_queue_ordered, если ваш драйвер реализует барьерные запросы, как это необходимо. Макрос blk_barrier_rq возвращает ненулевое значение, если текущий запрос является барьерным запросом. int blk_noretry_request(struct request *req); Этот макрос возвращает ненулевое значение, если данный запрос не должен быть повторен в случае ошибок. int end_that_request_first(struct request *req, int success, int count); void end_that_request_last(struct request *req); Используйте end_that_request_first для сообщения о завершении части запроса блочного ввода/вывода. Когда эта функция возвращает 0, запрос является завершённым и должен быть передан в end_that_request_last. rq_for_each_bio(bio, request) Другое реализованное в виде макроса управление структурой; он проходит по всем bio, которые составляют запрос. int blk_rq_map_sg(request_queue_t *queue, struct request *req, struct scatterlist *list); Заполняет данный список разборки информацией, необходимой для отображения буферов данного запроса для DMA передачи. typedef int (make_request_fn) (request_queue_t *q, struct bio *bio); Прототип функции make_request. void bio_endio(struct bio *bio, unsigned int bytes, int error); Сигнал завершения для данной bio. Эта функция должна использоваться только если ваш драйвер получил bio непосредственно из блочного уровня через функцию make_request. request_queue_t *blk_alloc_queue(int flags); void blk_queue_make_request(request_queue_t *queue, make_request_fn *func); Используйте blk_alloc_queue для создания очереди запросов, которая используется со своей функцией make_request. Эта функция должна быть установлена с помощью blk_queue_make_request. typedef int (prep_rq_fn) (request_queue_t *queue, struct request *req); void blk_queue_prep_rq(request_queue_t *queue, prep_rq_fn *func); Прототип и установка функции для функции подготовки команды, которая может быть использована для подготовки необходимой аппаратной команды, прежде чем запрос передаётся в вашу функцию request. int blk_queue_init_tags(request_queue_t *queue, int depth, struct blk_queue_tag *tags); int blk_queue_resize_tags(request_queue_t *queue, int new_depth); int blk_queue_start_tag(request_queue_t *queue, struct request *req); void blk_queue_end_tag(request_queue_t *queue, struct request *req); struct request *blk_queue_find_tag(request_queue_t *qeue, int tag); void blk_queue_invalidate_tags(request_queue_t *queue); Функции поддержки для драйверов, использующих очереди помеченных команд. |
Предыдущая Содержание Следующая |