블록디바이스 드라이이버 질문입니다
한빛미디어에서 나온 리눅스 디바이스 드라이버란 책을 공부하고 있습니다.
근데 책이 예전에 나온 책이라 그런지 함수들이 안맞는게 너무 많네요...
해서 몇가지 질문 올립니다..
request 방식의 가상하드디스크를 만드는 예제입니다.
----------------------------------------
static void vhdd_request(request_queue_t * q)
{
vhdd_device *pdevce;
struct request *vhdd_req;
char *pData;
int size;
if( vhdd_busy ) return;
while(1)
{
vhdd_req = elv_next_request(q);
if (!vhdd_req) return;
pdevce = (vhdd_device *) vhdd_req->rq_disk->private_data;
pData = pdevce->data
+ (vhdd_req->sector)*VHDD_SECTOR_SIZE;
if (vhdd_req->sector + vhdd_req->current_nr_sectors > get_capacity(vhdd_req->rq_disk))
{
end_request(vhdd_req, 0);
continue;
}
size = vhdd_req->current_nr_sectors * VHDD_SECTOR_SIZE;
switch(rq_data_dir(vhdd_req))
{
case READ : memcpy(vhdd_req->buffer, pData, size); break;
case WRITE : memcpy(pData, vhdd_req->buffer, size); break;
default : end_request(vhdd_req,0); continue;
}
vhdd_timer.expires = jiffies + 2;
vhdd_timer.data = (unsigned long) pdevce;
add_timer(&vhdd_timer);
vhdd_busy = 1;
return;
}
}
----------------------------------------
부분에서 elv_next_request 와 current_nr_sectors가 아예 없어진거 같더군요.
커널 2.6.32 에서 돌아가도록 수정하고 싶은데 방법이 없을까요?
해보진 않았지만
다음 정도로 수정하면 대강 돌아가지 않을까 싶네요..
elv_next_request(q) ==> blk_fetch_request(q)
vhdd_req->sector ==> blk_rq_pos(vhdd_req)
vhdd_req->curr_nr_sectors ==> blk_rq_cur_sectors(vhdd_req)
댓글 달기