Example #1
0
static int kaio_kernel_submit(struct file *file, struct kaio_req *kreq,
                              size_t nr_segs, size_t count, loff_t pos, unsigned long rw)
{
    struct kiocb *iocb;
    unsigned short op;
    struct iov_iter iter;
    int err;

    iocb = aio_kernel_alloc(GFP_NOIO);
    if (!iocb)
        return -ENOMEM;

    if (rw & REQ_WRITE)
        op = IOCB_CMD_WRITE_ITER;
    else
        op = IOCB_CMD_READ_ITER;

    iov_iter_init_bvec(&iter, kreq->bvecs, nr_segs, count, 0);
    aio_kernel_init_iter(iocb, file, op, &iter, pos);
    aio_kernel_init_callback(iocb, kaio_rw_kreq_complete, (u64)kreq);

    err = aio_kernel_submit(iocb);
    if (err)
        printk("kaio_kernel_submit: aio_kernel_submit failed with "
               "err=%d (rw=%s; state=%ld/0x%lx; pos=%lld; len=%ld)\n",
               err, (rw & REQ_WRITE) ? "WRITE" : "READ",
               kreq->preq->eng_state, kreq->preq->state, pos, count);
    return err;
}
Example #2
0
static int kaio_kernel_submit(struct file *file, struct bio *bio,
			      struct ploop_request * preq, iblock_t iblk,
			      unsigned long rw)
{
	struct kiocb *iocb;
	unsigned short op;
	struct iov_iter iter;
	struct bio_vec *bvec;
	size_t nr_segs;
	loff_t pos = (loff_t) bio->bi_sector;

	pos = ((loff_t)iblk << preq->plo->cluster_log) |
		(pos & ((1<<preq->plo->cluster_log) - 1));
	pos <<= 9;

	iocb = aio_kernel_alloc(GFP_NOIO);
	if (!iocb)
		return -ENOMEM;

	if (rw & (1<<BIO_RW))
		op = IOCB_CMD_WRITE_ITER;
	else
		op = IOCB_CMD_READ_ITER;

	bvec = bio_iovec_idx(bio, bio->bi_idx);
	nr_segs = bio_segments(bio);
	iov_iter_init_bvec(&iter, bvec, nr_segs, bvec_length(bvec, nr_segs), 0);
	aio_kernel_init_iter(iocb, file, op, &iter, pos);
	aio_kernel_init_callback(iocb, kaio_rw_aio_complete, (u64)preq);

	return aio_kernel_submit(iocb);
}