在 ubuntu 下修改 ext2 内核模块的版本时,一些警告被视为错误

Some warnings being treated as errors while making a modified ver of ext2 kernel module under ubuntu

我已经成功制作了 ext2 的修改版本(所谓的 myext2.ko)并测试了它的挂载和卸载,以及其他东西;当我将以下代码添加到我的 fs/myext2/file.c 中并尝试实现一个简单的 "encryption" func 时,问题就出现了,即取反读入字符串的最后一位:

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 中,内核代码ver 3.17.6 中几乎所有文件系统类型都使用;我只是将它们复制到 fs/myext2/file.c 中,并按照评论进行了一些小改动,这样我就可以在不更改任何 Makefile 的情况下进行一些测试。

但是当我将它们粘贴到我的 file.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 中的 func 指针来引用它们,或者说,我没有使用它们!

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
...
}

有没有人做过类似的事情并遇到过类似的问题?如果我做错了什么,请通知我,谢谢。

之前遇到过同样的错误。你应该添加 <linux/aio.h> 因为 ext2 对 reading/writing 文件使用异步 IO。 希望有所帮助:)