📄 ll_rw_blk.c.txt
字号:
any question,send email to netxiong@263.net
相关文件:
/linux/blkdev.h
/drivers/block/genhd.c
/drivers/block/elevator.c
**********************基本数据结构*****************************
(1):int read_ahead[MAX_BLKDEV];
#指示对于相应的major好的块设备怎样read ahead
(2):struct blk_dev_struct blk_dev[MAX_BLKDEV];
#结构定义在blkdev.h中
#相应的major号的设备被使用的话,就置位
(3):int * blk_size[MAX_BLKDEV]
# blk_size contains the size of all block-devices in units of 1024 byte * sectors
#它的形式位 blk_size[MAJOR][MINOR]
(4):int * blksize_size[MAX_BLKDEV]
#如果不置位的话,那么blk_size就被使用,用1024来计算大小。
#形式为blksize_size[MAJOR][MINOR]
/*
* 这个结构表明相应的物理设备的sector的大小,单位为字节
*/
(5):int * hardsect_size[MAX_BLKDEV]
# hardsect_size contains the size of the hardware sector of a device.
# if (!hardsect_size[MAJOR])
then 512 bytes is assumed.
else
sector_size is hardsect_size[MAJOR][MINOR]
#置位与否,可以表明sect的大小
***************************************************************
**************************常量*********************************
(1):static int batch_requests, queue_nr_requests;//队列上的请求数目
(2):int * max_sectors[MAX_BLKDEV]; //每一个请求上面的最大sector数目
***************************************************************
**********************初始化函数********************************
(1):int __init blk_dev_init(void)
#调用z2_init,rd_init……等块设备驱动程序
#该函数再genhd.c中北device_init调用,
***************************************************************
**********************request请求处理函数***********************
(1):void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
#如果一个块设备想利用标准的请求处理里程的话,就调用这个函数
#blk_init_free_list(q) //对free_list进行初始化
elevator_init(&q->elevator, ELEVATOR_LINUS);//电梯处理方式的选择,默认是linux形式
#q->request_fn = rfn;//这个例程再有request并要求处理时调用
q->back_merge_fn = ll_back_merge_fn;
q->front_merge_fn = ll_front_merge_fn;
q->merge_requests_fn = ll_merge_requests_fn;
q->make_request_fn = __make_request;//这些都是标准处理例程
#这个函数必须和blk_cleanup_queue配对调用
(3):blk_queue_make_request()
这个函数用来替换q->make_request_fn中的标准处理函数。
(2):static void blk_init_free_list(request_queue_t *q)
#INIT_LIST_HEAD(&q->request_freelist[READ]);
INIT_LIST_HEAD(&q->request_freelist[WRITE]);
INIT_LIST_HEAD(&q->pending_freelist[READ]);
INIT_LIST_HEAD(&q->pending_freelist[WRITE]);//初始化列表
#for (i = 0; i < queue_nr_requests; i++) {
rq = kmem_cache_alloc(request_cachep, SLAB_KERNEL);
memset(rq, 0, sizeof(struct request));
rq->rq_status = RQ_INACTIVE;
list_add(&rq->table, &q->request_freelist[i & 1]);
}//将request_nr_requests个请求分为两半,read和write每个半数
(3):void blk_cleanup_queue(request_queue_t * q)
# count -= __blk_cleanup_queue(&q->request_freelist[READ]);
#对请求列表进行清理。调用__blk_cleanup_queue把list中的请求都释放掉
(4):static inline int get_max_sectors(kdev_t dev)
if (!max_sectors[MAJOR(dev)])
return MAX_SECTORS;
return max_sectors[MAJOR(dev)][MINOR(dev)];
#得到最大的sector数
(5)inline request_queue_t *blk_get_queue(kdev_t dev) //从设备号得到该设备所对应的请求队列
****************************************************************
*******************请求处理函数**********************************
(1):generic_make_request(dev,rw,bh)
这个是标准的请求处理函数,他值按照bh中的bh->b_rdev来判断送到那个设备进行处理
while (q->make_request_fn(q, rw, bh)); //最后调用请求处理函数,一般是__make_request
(2):static int __make_request(request_queue_t * q, int rw,struct buffer_head * bh)
//这个是主要的处理函数
elevator_t *elevator = &q->elevator; //得到这个请求队列的请求电梯处理类
max_sectors = get_max_sectors(bh->b_rdev); //从这里开始进行请求的合并
el_ret = elevator->elevator_merge_fn(q, &req, head, bh, rw,max_sectors);
//这个函数确定合并的方式---前合并还是后合并,函数原型在/block/elevator.c中
switch (el_ret) {
case ELEVATOR_BACK_MERGE:
if (!q->back_merge_fn(q, req, bh, max_segments) //调用请求队列的merge函数
…… //后合并,放在一个请求的后面
case ELEVATOR_FRONT_MERGE:
if (!q->front_merge_fn(q, req, bh, max_segments) //调用请求队列的merge函数
…… //前合并,放在一个请求的前面
case ELEVATOR_NO_MERGE:
…… //无法合并,产生一个新的请求
}
……
req->hard_sector = req->sector = sector;
req->hard_nr_sectors = req->nr_sectors = count;
req->current_nr_sectors = req->hard_cur_sectors = count;
…… //对request进行设置,主要是使用buffer_head和一些计算出来的结果对request进行设置
blk_started_io(count); //空函数,不用例会
add_request(q, req, insert_here); //加入到请求处理队列中。
*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -