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; }
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); }