Hi,
I want to read data by kernel module from a block device like this:
static int module_init(void)
{
const size_t len = 0x1000;
struct file *file;
char *buf;
struct iovec iovec;
struct kiocb kiocb;
struct iov_iter iov_iter;
ssize_t rcount;
buf = vmalloc(len);
file = filp_open("/dev/sda", 0, 0);
iovec.iov_base = buf;
iovec.iov_len = len;
kiocb.ki_filp = file;
kiocb.ki_pos = 0x200000000;
kiocb.ki_complete = NULL;
kiocb.ki_flags = IOCB_DIRECT;
kiocb.ki_hint = 0;
iov_iter_init(&iov_iter, READ, &iovec, 1, len);
rcount = blkdev_read_iter(&kiocb, &iov_iter);
filp_close(file, current);
vfree(buf);
return rcount < 0 ? rcount : 0;
}
but blkdev_read_iter always return -EFAULT. I tried to localize the error:
blkdev_read_iter
generic_file_read_iter
blkdev_direct_IO
__blkdev_direct_IO_simple
bio_iov_iter_get_pages
__bio_iov_iter_get_pages
iov_iter_get_pages
get_user_pages_fast
...
find_vma
find_vma return NULL for vmalloc'ed block.
Kernel version is 4.19.16.
Is this behavior valid for iov_iter with type ITER_KVEC?
--
Ivan Safonov.