10 块设备
函数名 |
功能 |
函数形式 |
参数 |
描述 |
其他 |
blk_cleanup_queue |
当不再需要一个请求队列时,释放一个request_queue_t |
void blk_cleanup_queue (request_queue_t * q); |
q为要释放的请求队列。 |
blk_cleanup_queue与blk_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结构传递到设备驱动程序的常用方式为让驱动程序把请求收集到请求队列,然后让驱动程序准备就绪时把请求从那个队列移走。这种方式对很多块设备驱动程序很有效。但是,有些块设备(如虚拟设备md或lvm)并不是这样,而是把请求直接传递给驱动程序,这可以通过调用 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) |
rw为I/O操作的类型,即READ、 WRITE或 READA,bh是内存和磁盘上的缓冲区首部。 |
READ和WRITE的含义很明确,READA为预读。该函数不返回任何状态。请求的成功与失败,以及操作的完成是由bh->b_end_io 递送的。 |
|
submit_bh |
类似于上一个函数 |
void submit_bh (int rw, struct buffer_head * bh) |
rw为I/O操作的类型,即READ、 WRITE或 READA,bh为描述I/O的buffer_head |
该函数与与generic_make_request的目的非常类似,但submit_bh做更多的事情。 |
|
ll_rw_block |
对块设备的低级访问 |
void ll_rw_block (int rw, int nr, struct buffer_head * * bhs) |
rw为READ、 WRITE或 READA,nr为数组中buffer_heads的个数,bhs为指向buffer_heads的数组。 |
对普通文件的读/写和对块设备的读/写,都是通过调用该函数完成的。 |
所有的缓冲区必须是针对同一设备的。 |