virtio-scsi: Split virtio_scsi_handle_ctrl_req from virtio_scsi_handle_ctrl
To share with dataplane code. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
bf359a445e
commit
dc56b7c4fb
|
@ -308,40 +308,46 @@ fail:
|
||||||
req->resp.tmf.response = VIRTIO_SCSI_S_BAD_TARGET;
|
req->resp.tmf.response = VIRTIO_SCSI_S_BAD_TARGET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void virtio_scsi_handle_ctrl_req(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
||||||
|
{
|
||||||
|
VirtIODevice *vdev = (VirtIODevice *)s;
|
||||||
|
int type;
|
||||||
|
|
||||||
|
if (iov_to_buf(req->elem.out_sg, req->elem.out_num, 0,
|
||||||
|
&type, sizeof(type)) < sizeof(type)) {
|
||||||
|
virtio_scsi_bad_req();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtio_tswap32s(vdev, &req->req.tmf.type);
|
||||||
|
if (req->req.tmf.type == VIRTIO_SCSI_T_TMF) {
|
||||||
|
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlTMFReq),
|
||||||
|
sizeof(VirtIOSCSICtrlTMFResp)) < 0) {
|
||||||
|
virtio_scsi_bad_req();
|
||||||
|
} else {
|
||||||
|
virtio_scsi_do_tmf(s, req);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (req->req.tmf.type == VIRTIO_SCSI_T_AN_QUERY ||
|
||||||
|
req->req.tmf.type == VIRTIO_SCSI_T_AN_SUBSCRIBE) {
|
||||||
|
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlANReq),
|
||||||
|
sizeof(VirtIOSCSICtrlANResp)) < 0) {
|
||||||
|
virtio_scsi_bad_req();
|
||||||
|
} else {
|
||||||
|
req->resp.an.event_actual = 0;
|
||||||
|
req->resp.an.response = VIRTIO_SCSI_S_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtio_scsi_complete_req(req);
|
||||||
|
}
|
||||||
|
|
||||||
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
|
||||||
{
|
{
|
||||||
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
|
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
|
||||||
VirtIOSCSIReq *req;
|
VirtIOSCSIReq *req;
|
||||||
|
|
||||||
while ((req = virtio_scsi_pop_req(s, vq))) {
|
while ((req = virtio_scsi_pop_req(s, vq))) {
|
||||||
int type;
|
virtio_scsi_handle_ctrl_req(s, req);
|
||||||
|
|
||||||
if (iov_to_buf(req->elem.out_sg, req->elem.out_num, 0,
|
|
||||||
&type, sizeof(type)) < sizeof(type)) {
|
|
||||||
virtio_scsi_bad_req();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtio_tswap32s(vdev, &req->req.tmf.type);
|
|
||||||
if (req->req.tmf.type == VIRTIO_SCSI_T_TMF) {
|
|
||||||
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlTMFReq),
|
|
||||||
sizeof(VirtIOSCSICtrlTMFResp)) < 0) {
|
|
||||||
virtio_scsi_bad_req();
|
|
||||||
} else {
|
|
||||||
virtio_scsi_do_tmf(s, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (req->req.tmf.type == VIRTIO_SCSI_T_AN_QUERY ||
|
|
||||||
req->req.tmf.type == VIRTIO_SCSI_T_AN_SUBSCRIBE) {
|
|
||||||
if (virtio_scsi_parse_req(req, sizeof(VirtIOSCSICtrlANReq),
|
|
||||||
sizeof(VirtIOSCSICtrlANResp)) < 0) {
|
|
||||||
virtio_scsi_bad_req();
|
|
||||||
} else {
|
|
||||||
req->resp.an.event_actual = 0;
|
|
||||||
req->resp.an.response = VIRTIO_SCSI_S_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
virtio_scsi_complete_req(req);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ void virtio_scsi_common_realize(DeviceState *dev, Error **errp,
|
||||||
HandleOutput cmd);
|
HandleOutput cmd);
|
||||||
|
|
||||||
void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp);
|
void virtio_scsi_common_unrealize(DeviceState *dev, Error **errp);
|
||||||
|
void virtio_scsi_handle_ctrl_req(VirtIOSCSI *s, VirtIOSCSIReq *req);
|
||||||
void virtio_scsi_handle_cmd_req(VirtIOSCSI *s, VirtIOSCSIReq *req);
|
void virtio_scsi_handle_cmd_req(VirtIOSCSI *s, VirtIOSCSIReq *req);
|
||||||
|
|
||||||
#endif /* _QEMU_VIRTIO_SCSI_H */
|
#endif /* _QEMU_VIRTIO_SCSI_H */
|
||||||
|
|
Loading…
Reference in a new issue