2015-01-18 6 views
0

나는 ext2 (소위 myext2.ko라고 함)의 수정 된 버전을 만드는 데 성공했으며 마운트 및 umount와 다른 것을 테스트했습니다.일부 경고는 우분투에서 ext2 커널 모듈의 수정 된 버전을 만드는 동안 오류로 취급됩니다

ssize_t my_new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) 
{ 
    struct iovec iov; //changed 
    struct kiocb kiocb; 
    struct iov_iter iter; 
    ssize_t ret; 
    //inserted by adward - begin 
    size_t i; 
    char buff[len]; 
    for (i=0;i<len;i++){ 
     buff[i] = buf[i]^1; 
    } 
    iov.iov_base = (void __user *)buff; 
    iov.iov_len = len; 
    printk("Inside my_new_sync_write"); 
    //inserted by adward - end 
    init_sync_kiocb(&ki_nbytesocb, filp); 
    kiocb.ki_pos = *ppos; 
    kiocb.ki_nbytes = len; 
    iov_iter_init(&iter, WRITE, &iov, 1, len); 

    ret = filp->f_op->write_iter(&kiocb, &iter); 
    if (-EIOCBQUEUED == ret) 
     ret = wait_on_sync_kiocb(&kiocb); 
    *ppos = kiocb.ki_pos; 
    return ret; 
} 

ssize_t my_new_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) 
{ 
    struct iovec iov = { .iov_base = buf, .iov_len = len }; 
    struct kiocb kiocb; 
    struct iov_iter iter; 
    ssize_t ret; 

    //inserted by adward - begin 
    size_t i; 
    //inserted by adward - end 
    init_sync_kiocb(&kiocb, filp); 
    kiocb.ki_pos = *ppos; 
    kiocb.ki_nbytes = len; 
    iov_iter_init(&iter, READ, &iov, 1, len); 

    ret = filp->f_op->read_iter(&kiocb, &iter); 
    if (-EIOCBQUEUED == ret) 
     ret = wait_on_sync_kiocb(&kiocb); 
    *ppos = kiocb.ki_pos; 

    //inserted by adward - begin 
    for (i=0;i<len;i++){ 
     buf[i] ^= 1; 
    } 
    printk("inside my_new_sync_read"); 
    //inserted by adward - end 

    return ret; 
} 

: 내 FS/myext2/file.c는 다음 코드를 추가하고 간단한 "암호화"FUNC를 구현하려고 할 때 문제가 발생, 그 읽기의 문자열의 마지막 비트를 부정한다 위의 두 함수의 프로토 타입은 실제로 fs/read_write.c에 있으며 커널 코드 버전 3.17.6의 거의 모든 파일 시스템 유형을 사용합니다. 방금 fs/myext2/file.c에 복사 한 다음 약간의 변경 사항을 주석으로 추가하여 Makefile을 변경하지 않고도 일부 테스트를 수행 할 수 있습니다.

하지만 내 file.c는 붙여 넣을 순간, "sudo는 메이크업"은 다음과 같은 오류 메시지가 있습니다 : 나는 FUNC 포인터를 변경하여 그들에 대해 참조하지 않은 경우에도 /home/adward/linux-3.17.6/fs/myext2/file.c:64:15: error: storage size of ‘kiocb’ isn’t known struct kiocb kiocb; ^ /home/adward/linux-3.17.6/fs/myext2/file.c:65:18: error: storage size of ‘iter’ isn’t known struct iov_iter iter; ^ cc1: some warnings being treated as errors

을 동일한 소스 코드 파일에 file_operations에 있거나 말하면, 나는 그들을 사용하지 않았다!

P. 내 file_operation 구조체는 이제 다음과 같습니다

const struct file_operations myext2_file_operations = { 
.llseek  = generic_file_llseek, 
.read  = new_sync_read, //want to replace with my_new_sync_read 
.write  = new_sync_write, //want to replace with my_new_sync_write 
... 
} 

가지고 비슷한 일이 같은 몇 가지 문제에 충돌 한 사람? 나에게 뭔가 잘못된 것을 한 경우 알려주십시오. 감사합니다.

답변

0

이전에 같은 오류가 발생했습니다. U는 ext2가 파일 읽기/쓰기를 위해 비동기 IO를 사용하므로 <linux/aio.h>을 추가해야합니다. 희망하는 사람 :