2012-03-05 7 views
1

블록 장치 드라이버 파일 (/ dev/mybd)에서 lseek64를 호출하면 항상 실패합니다. (나는/dev/mybd ok에서 읽고 읽고 쓸 수있다).lseek64에 장치 별 조치가 있습니까?

그러나 sata 디스크 인/dev/sdb에서 동일한 인수로 lseek64를 사용할 수 있으면 항상 성공합니다.

lseek에 블록 장치가 필요합니까? 아니면 순수한 커널 함수입니까? 코드를 보면

+1

예. 너 무슨 짓을 한거야? –

+0

@BasileStarynkevitch 그렇다면 장치 드라이버를 지원하기 위해 어떻게해야합니까? – yangsuli

+0

저는 커널 전문가가 아닙니다. 읽었습니까 http://www.makelinux.net/ldd3/chp-16-sect-2 –

답변

3

, 기본 블록 장치에 대한 추구는 fs/block_dev.c에 있습니다

static loff_t block_llseek(struct file *file, loff_t offset, int origin) 
{ 
     struct inode *bd_inode = file->f_mapping->host; 
     loff_t size; 
     loff_t retval; 

     mutex_lock(&bd_inode->i_mutex); 
     size = i_size_read(bd_inode); 

     retval = -EINVAL; 
     switch (origin) { 
       case SEEK_END: 
         offset += size; 
         break; 
       case SEEK_CUR: 
         offset += file->f_pos; 
       case SEEK_SET: 
         break; 
       default: 
         goto out; 
     } 
     if (offset >= 0 && offset <= size) { 
       if (offset != file->f_pos) { 
         file->f_pos = offset; 
       } 
       retval = offset; 
     } 
out: 
     mutex_unlock(&bd_inode->i_mutex); 
     return retval; 
} 

특정 블록 장치에 없음 전화. 유일한 호출은 i_size_read이며, 그저 SMP 마법 만 수행합니다.

0

lseek는 시스템 호출입니다. 그리고 그것은 커널에 따라 다릅니다. 장치에이 기능을 구현해야하며 llseek 호출에서 장치 드라이버의 "file_operations"구조를 추가해야합니다.

file_operation 구조에서 모든 장치 관련 기능은 관련된 시스템 호출과 매핑됩니다. 읽기, 쓰기, 열기와 같이 특정 장치 드라이버 코드와 연결됩니다. 따라서 이러한 함수를 호출 할 때마다 커널은 호출과 연결된 장치 드라이버의 코드를 실행합니다. 장치 드라이버가 호출을 구현하지 않으면 해당 값이 NULL로 지정됩니다. 이 경우 NULL 지정된 호출을 호출하면 호출이 항상 실패합니다.

그러나 lseek에서 'file_operations'구조체 링크가 NULL이면 커널은 파일 위치에 대한 'file'구조체 포인터를 사용합니다. 이로 인해 예기치 않은 결과가 발생할 수 있습니다. 하지만 어쨌든 호출 (o'relley 출판사에서 리눅스 장치 드라이버 당) 작동합니다.

그래서 실제 문제가 무엇인지 잘 모르겠습니다. 따라서 lseek 호출을 아직 구현하지 않았다면 구현하고 다시 시도하십시오.

관련 문제