10 块设备

  函数名

功能

函数形式

参数

    描述

  其他

blk_cleanup_queue

当不再需要一个请求队列时,释放一个request_queue_t

void blk_cleanup_queue (request_queue_t * q);

q为要释放的请求队列。

blk_cleanup_queueblk_init_queue是成对出现的。应该在释放请求队列时调用该函数;典型的情况是块设备正被注销时调用。该函数目前的主要任务是释放分配到队列中所有的struct request结构。

低级驱动程序有希望首先完成任何重要的请求

 

blk_queue_headactive

指明请求队列的头是否可以是活跃的。

void blk_queue_headactive (request_queue_t * q, int active)

q为这次申请的队列,active为一个标志,表示队列头在哪儿是活跃的。

块设备驱动程序可以选定把当前活动请求留在请求队列,只有在请求完成时才移走它。队列处理例程为安全起见把这种情况假定为缺省值,并在请求被撤销时,将不再在合并或重新组织请求时包括请求队列的头。

如果驱动程序在处理请求之前从队列移走请求,它就可以在合并和重新安排中包含队列头。这可以通过以active标志为0来调用blk_queue_headactive

如果一个驱动程序一次处理多个请求,它必须从请求队列移走他们(或至少一个)。

当一个队列被插入,则假定该队列头为不活跃的。

 

blk_queue_make_request

为设备定义一个交替的make_request 函数。

void blk_queue_make_request (request_queue_t * q, make_request_fn * mfn)

q为受影响设备的请求队列,mfn为交替函数。

 

 

buffer_heads结构传递到设备驱动程序的常用方式为让驱动程序把请求收集到请求队列,然后让驱动程序准备就绪时把请求从那个队列移走。这种方式对很多块设备驱动程序很有效。但是,有些块设备(如虚拟设备mdlvm)并不是这样,而是把请求直接传递给驱动程序,这可以通过调用 blk_queue_make_request()函数来达到。

按以上方式操作的驱动程序必须能够恰当地处理在“高内存”的缓冲区,这是通过调用 bh_kmap 获得一个内核映射,或通过调用 create_bounce 在常规内存创建一个缓冲区。

blk_init_queue

块设备的使用准备一个请求队列。

void blk_init_queue (request_queue_t * q, request_fn_proc * rfn)

q为要初始化的请求队列,rfn为处理请求所调用的函数。

如果一个块设备希望使用标准的请求处理例程,就调用该函数。当请求队列上有待处理的请求时,调用rfn函数。

blk_init_queue反操作函数为 blk_cleanup_queue ,当撤销块设备时调用后者(例如在模块卸载时)。

generic_make_request

形成块设备I/O请求。

void generic_make_request (int rw, struct buffer_head * bh)

rwI/O操作的类型,即READ WRITE  READAbh是内存和磁盘上的缓冲区首部。

READWRITE的含义很明确,READA为预读。该函数不返回任何状态。请求的成功与失败,以及操作的完成是由bh->b_end_io 递送的。

 

submit_bh

类似于上一个函数

void submit_bh (int rw, struct buffer_head * bh)

rwI/O操作的类型,即READ WRITE  READAbh为描述I/Obuffer_head

该函数与generic_make_request的目的非常类似,但submit_bh做更多的事情。

 

ll_rw_block

块设备的低级访问

void ll_rw_block (int rw, int nr, struct buffer_head * * bhs)

rwREAD WRITE  READAnr为数组中buffer_heads的个数,bhs为指向buffer_heads的数组。

对普通文件的读/写和对块设备的读/写,都是通过调用该函数完成的。

所有的缓冲区必须是针对同一设备的。