블록 디바이스 드라이버 소스 수정 요청

손정수의 이미지

블록 디바이스 드라이버를 만들어 보려고 하는데요....자꾸만 커널 버그가 뜹니다...
코드는 다음과 같습니다.


       struct buffer_head *bh;

        ...........슬램 할당자를 통해 버퍼 헤더 할당 받음......

        switch(rw) {
        case WRITE:
                mark_buffer_dirty(bh);
                ll_rw_block(WRITE,1,&bh);
                wait_on_buffer(bh);     //input buf to queue
                break;
        case READ:
                mark_buffer_uptodate(bh, 0);    //set BH_Uptodate into 0.
                if(buffer_uptodate(bh)){        //is buffer contains valid data????
                        return 0;
                  }                  

                ll_rw_block(READA,1,&bh);       //not exe --> error
                wait_on_buffer(bh);
                break;
        default :
                BUG();
        }

다음은 버퍼 헤더의 필드값입니다.

        dev = MKDEV(3,65);
        bh->b_dev = dev;
        bh->b_rdev = dev;
        bh->b_blocknr = 0;      //position in sector, 0
        bh->b_rsector = 0;      //pysical sector number!
        bh->b_size = 512;       //block size
        bh->b_data = (char *)__get_dma_pages(GFP_KERNEL, get_order(size));
        bh->b_state = 0;

이렇게 하면 커널 버그가 뚜르루 뜹니다. 파티션은 /dev/hdb1 에다 썼습니다.

무슨 다른 설정을 해줘야 하나요.. .고수님들 제발 좀 도와 주세요...