2011-10-26 2 views
6

대학 과제의 경우, 파일 크기가 60 바이트보다 작 으면 inode의 블록 포인터에 파일을 저장하도록 ext2 파일 시스템을 수정하고 파일이 커지면 일반 블록 저장소로 이동해야합니다 .커널 메모리를 ext2 블록에 쓰기

2.6 리눅스 커널 소스 (지시 한대로)에서 ext2 코드를 복사하여 거기서갔습니다.

파일이 60 바이트보다 커지면 현재 inode의 블록 포인터 배열에있는 모든 데이터를 실제 블록으로 복사해야합니다. 그래서 커널 메모리를 ext2 블록에 작성해야합니다. do_sync_write에 대한 간단한 호출은 사용자 공간 메모리가 필요하기 때문에 여기서 작동하지 않습니다.

do_sync_write의 구현을 살펴 봤지만 실제로 어떻게 복제 할 지 모르겠지만 대신 커널 메모리를 사용합니다.

이 특정 부분의 나의 현재 구현은 (작동하지 않습니다) :

ssize_t extmod_write(struct file *filp, const char *buf, 
      size_t len, loff_t *ppos) 
{ 
... 
printk(KERN_INFO "Switching to regular file"); 
temp = kmalloc(inode->i_size, GFP_KERNEL); 
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size); 

/* Need to clear the block pointers before they are allocated by kernel */ 
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data)); 

if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) { 
    printk(KERN_INFO "DAMN! Writing current buffer failed"); 
    return -EINVAL; 
} 
kfree(temp); 
return do_sync_write(filp, buf, len, ppos); 

편집 :

나는 심볼릭 링크 바라 보았다. 기본적으로 ext2는 "빠른 심볼릭 링크"개념을 가지고 있습니다. 즉 링크 이름이 60 바이트 미만입니다. 빠른 심볼릭 링크 인 경우 데이터는 블록 포인터에 저장됩니다. 이것은하기 쉽고 나는 이미 정규 파일을 위해 이것을 구현했다. 링크가 빠른 심볼릭 링크가 아닌 경우 데이터는 일반 파일과 동일한 방식으로 처리됩니다. 나는 제곱으로 돌아 왔다고 생각해.

+2

힌트 : 심볼릭 링크를 살펴보십시오. IIRC는 크기가 충분히 작 으면 inode에도 저장됩니다. – wildplasser

+0

예, 링크 이름을'memcpy'에서'EXT2_I (iode) -> i_data'로 볼 수 있습니다. 내 문제는 그 데이터를 블록에 복사하려는 경우입니다. ext2 모듈은 일반적인 방식으로 사용자 데이터를 기대합니다. – Anthony

+0

저는 숙제 나 독서를하지 않고 단지 힌트를주고 있습니다. 페이로드가 너무 커져 inode에 적합하지 않을 때 symlink 코드가 수행하는 작업을 살펴보십시오. 분명히 디스크 블록을 할당해야하고 inode 블록 포인터를 가리 키도록 초기화해야합니다. 비트 맵을 언급하지 마십시오 (ext2가 가지고 있는지 알 수 없습니다) – wildplasser

답변

0

나는 그것을 알아낼 수 있었다. struct buffer_head 인스턴스를 가져와 데이터를 읽고 쓰는 것이 필요했습니다. 논리 블록 번호를 반복하고 ext2_get_block을 사용하여 블록을 검색 (필요한 경우 할당) 한 다음 sb_getblk을 사용하여 실제 버퍼를 가져 와서 쓰기. my blog에 구현을 게시했습니다.

1

벙어리 숙제.

코드가 작동하지 않습니다. mmap()을 시도하고 죽는다.

관련 문제