|
buffer_head是通过lock标志来同步的吗?
我想实现以下目标:
在模块中申明一个buffer_head,存放自己的数据,然后在my_make_request()中先通过generic_make_request()完成此buffer_head的读写;当监测到buffer_head的buffer_locked(buffer_head)=0时再完成其它的请求.
代码框架如下:
static int hdpro_make_request(request_queue_t *q, int rw, struct buffer_head *bh)
{
..........................................
//flagbh为我自己申明的buffer_head,在模块初始化时已经通过
do {
flagbh = kmem_cache_alloc(bh_cachep, SLAB_NOIO);
if (flagbh)
break;
run_task_queue(&tq_disk);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(HZ);
} while (1);分派了
flagbh->b_rdev=; //真实设备号
flagbh->b_blocknr=; //逻辑块号
flagbh->b_rsector=; //真实设备上的块号
flagbh->b_size=512; //缓冲区大小
flagbh->b_data=mybuffer; //数据区
flagbh->b_state=(1 << BH_Req)|(1 << BH_Mapped)|(1 << BH_Lock);//缓冲区状态
flagbh->b_dev=; //逻辑设备号
generic_make_request(READ,flagbh); //
generic_make_request(rw,bh);
return 0;
}
我这样做,插入模块操作时提示错误: NULL pointer,具体的dmesg显示是bh_action()->...->generic_make_request()错.请大家帮忙分析一下,或给个更好的实现方法.3X |
|