Мне удалось сделать модифицированную версию 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
...
}
Кто-нибудь, кто сделал что-то подобное и столкнулся с некоторыми проблемами, подобными этой? Пожалуйста, сообщите мне, если я сделал что-то замечательное неправильно, спасибо.