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.

Reply via email to