Некоторые предупреждения рассматриваются как ошибки при создании модифицированной версии модуля ядра ext2 под Ubuntu.

Мне удалось сделать модифицированную версию ext2 (т.н. myext2.ko) и протестировать ее на монтирование, размонтирование и еще кое-что; проблема возникает, когда я добавляю следующий код в свой fs/myext2/file.c и пытаюсь реализовать простую функцию «шифрования», то есть отрицание последнего бита считываемой строки:

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/read_write.c и используется почти всеми типами файловых систем в коде ядра версии 3.17.6; Я просто скопировал их в fs/myext2/file.c и внес некоторые незначительные изменения в соответствии с комментариями, так что я могу провести некоторый тест, не меняя Makefile.

Но в тот момент, когда я вставляю их в свой файл.c, «sudo make» выдает следующее сообщение об ошибке: /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.S. Моя структура 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
...
}

Кто-нибудь, кто сделал что-то подобное и столкнулся с некоторыми проблемами, подобными этой? Пожалуйста, сообщите мне, если я сделал что-то замечательное неправильно, спасибо.


person Adward_R    schedule 18.01.2015    source источник


Ответы (1)


Встречал такую ​​же ошибку раньше. Вы должны добавить <linux/aio.h>, так как ext2 использует асинхронный ввод-вывод для чтения/записи файлов. Надеюсь, это поможет :)

person Ru Wang    schedule 18.01.2015