16.5. Краткая справка |
#include
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
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
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
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);
Функции поддержки для драйверов, использующих очереди помеченных команд.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.