2017-12-22 4 views
1

는 I는 I 백엔드 (existen 장치)에 포인터 시도 필터 드라이버의 초기화 중에 bdev_get_queue의 본체 블록 장치 (리눅스 우분투 16) 하는 "필터"를 개발 매크로는 멋진 설명을 표시합니다 "this never NULL"은입니다. 그러나 의 경우 NULL이됩니다. 의 struct bd_device의 bd_disk 필드가 있습니다.왜 bdev_get_queue가 NULL을 반환합니까?

추가로 확인해야 할 사항은 무엇입니까?

static int __init dua_init(void) 
{ 
    int status; 
    struct request_queue *backend_queue = NULL; 
    struct super_block *sb = NULL; 

    printk(KERN_NOTICE __MODULE__ ": Initialize the driver ...\n"); 

    if (IS_ERR(backend_bdev = lookup_bdev(dudrv_bckend, FMODE_READ))) 
     { 
     status = PTR_ERR(backend_bdev); 
     printk(KERN_ERR __MODULE__ ": lookup_bdev(%s) -> %d\n", dudrv_bckend, status); 
     return status; 
     } 

    $DELAY(1); 

    if (sb = freeze_bdev(backend_bdev)) 
     $TRACE(": freeze I/O on block device %s ...", dudrv_bckend); 

    $DELAY(1); 

    $TRACE(" %p ", backend_bdev->bd_disk); 

    $DELAY(1); 

    backend_queue = bdev_get_queue(backend_bdev); 

    $TRACE(" -- "); 

    $DELAY(1); 

    if (backend_make_request_fn != backend_queue->make_request_fn) 
     { 
     backend_make_request_fn = backend_queue->make_request_fn; 
     backend_queue->make_request_fn = dua_make_request_fn; 

     $TRACE(": Change for %s request_fn = %p -> %p, ", dudrv_bckend, backend_make_request_fn, backend_queue->make_request_fn); 
     } 
    else { 
     printk(KERN_NOTICE __MODULE__ ": I/O request process has been set.\n"); 
     } 

    $TRACE(" -- "); 

    /* unlock filesystem */ 
    $DELAY(1); 
    if (sb) 
     if (status = thaw_bdev(backend_bdev, sb)) 
      printk(KERN_NOTICE __MODULE__ ": thaw_bdev() -> %d\n", status); 

    printk(KERN_NOTICE __MODULE__ ": End the driver initialization.\n"); 

    return 0; 
} 

갱신 1 다음 bdev_get_queue구조체 block_device에 의해 반환하도록되어 큐의 포인터의 차이가 무엇인지. bd_queue?

+0

코드를 입력하십시오. – Tsyvarev

+0

** 질문 게시판에 코드를 추가하십시오 **. 코드를 삽입 한 후 코드를 선택하고 Ctrl + K 또는 "{}"버튼을 누릅니다. – Tsyvarev

답변

1

lookup_bdev() 전체 Block I/O 컨텍스트를 만들지 마십시오.

관련 문제