在 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。
希望有所帮助:)
我已经成功制作了 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。
希望有所帮助:)