понедельник, 16 мая 2011 г.

16.5. Краткая справка

16.5. Краткая справка
V*D*V
#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);

Функции поддержки для драйверов, использующих очереди помеченных команд.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.