dataplane: extract virtio-blk read/write processing into do_rdwr_cmd()
Extract code for read/write command processing into do_rdwr_cmd(). This brings together pieces that are spread across process_request(). The real motivation is to set the stage for handling misaligned requests, which the next patch tackles. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c53b1c5114
commit
b5ef1aab94
@ -130,6 +130,22 @@ static void do_get_id_cmd(VirtIOBlockDataPlane *s,
|
||||
complete_request_early(s, head, inhdr, VIRTIO_BLK_S_OK);
|
||||
}
|
||||
|
||||
static int do_rdwr_cmd(VirtIOBlockDataPlane *s, bool read,
|
||||
struct iovec *iov, unsigned int iov_cnt,
|
||||
long long offset, unsigned int head,
|
||||
QEMUIOVector *inhdr)
|
||||
{
|
||||
struct iocb *iocb;
|
||||
|
||||
iocb = ioq_rdwr(&s->ioqueue, read, iov, iov_cnt, offset);
|
||||
|
||||
/* Fill in virtio block metadata needed for completion */
|
||||
VirtIOBlockRequest *req = container_of(iocb, VirtIOBlockRequest, iocb);
|
||||
req->head = head;
|
||||
req->inhdr = inhdr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int process_request(IOQueue *ioq, struct iovec iov[],
|
||||
unsigned int out_num, unsigned int in_num,
|
||||
unsigned int head)
|
||||
@ -139,7 +155,6 @@ static int process_request(IOQueue *ioq, struct iovec iov[],
|
||||
struct virtio_blk_outhdr outhdr;
|
||||
QEMUIOVector *inhdr;
|
||||
size_t in_size;
|
||||
struct iocb *iocb;
|
||||
|
||||
/* Copy in outhdr */
|
||||
if (unlikely(iov_to_buf(iov, out_num, 0, &outhdr,
|
||||
@ -167,12 +182,12 @@ static int process_request(IOQueue *ioq, struct iovec iov[],
|
||||
|
||||
switch (outhdr.type) {
|
||||
case VIRTIO_BLK_T_IN:
|
||||
iocb = ioq_rdwr(ioq, true, in_iov, in_num, outhdr.sector * 512);
|
||||
break;
|
||||
do_rdwr_cmd(s, true, in_iov, in_num, outhdr.sector * 512, head, inhdr);
|
||||
return 0;
|
||||
|
||||
case VIRTIO_BLK_T_OUT:
|
||||
iocb = ioq_rdwr(ioq, false, iov, out_num, outhdr.sector * 512);
|
||||
break;
|
||||
do_rdwr_cmd(s, false, iov, out_num, outhdr.sector * 512, head, inhdr);
|
||||
return 0;
|
||||
|
||||
case VIRTIO_BLK_T_SCSI_CMD:
|
||||
/* TODO support SCSI commands */
|
||||
@ -198,12 +213,6 @@ static int process_request(IOQueue *ioq, struct iovec iov[],
|
||||
g_slice_free(QEMUIOVector, inhdr);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
/* Fill in virtio block metadata needed for completion */
|
||||
VirtIOBlockRequest *req = container_of(iocb, VirtIOBlockRequest, iocb);
|
||||
req->head = head;
|
||||
req->inhdr = inhdr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void handle_notify(EventHandler *handler)
|
||||
|
Loading…
Reference in New Issue
Block a user