virtio-mem: detach the element from the virtqueue when error occurs

If error occurs while processing the virtio request we should call
'virtqueue_detach_element' to detach the element from the virtqueue
before free the elem.

Signed-off-by: Li Qiang <liq3ea@163.com>
Message-Id: <20200816142245.17556-1-liq3ea@163.com>
Fixes: 910b25766b ("virtio-mem: Paravirtualized memory hot(un)plug")
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Li Qiang 2020-08-16 07:22:45 -07:00 committed by Michael S. Tsirkin
parent a5bd05800f
commit 0c404e45c5

View File

@ -318,6 +318,7 @@ static void virtio_mem_handle_request(VirtIODevice *vdev, VirtQueue *vq)
if (iov_to_buf(elem->out_sg, elem->out_num, 0, &req, len) < len) { if (iov_to_buf(elem->out_sg, elem->out_num, 0, &req, len) < len) {
virtio_error(vdev, "virtio-mem protocol violation: invalid request" virtio_error(vdev, "virtio-mem protocol violation: invalid request"
" size: %d", len); " size: %d", len);
virtqueue_detach_element(vq, elem, 0);
g_free(elem); g_free(elem);
return; return;
} }
@ -327,6 +328,7 @@ static void virtio_mem_handle_request(VirtIODevice *vdev, VirtQueue *vq)
virtio_error(vdev, "virtio-mem protocol violation: not enough space" virtio_error(vdev, "virtio-mem protocol violation: not enough space"
" for response: %zu", " for response: %zu",
iov_size(elem->in_sg, elem->in_num)); iov_size(elem->in_sg, elem->in_num));
virtqueue_detach_element(vq, elem, 0);
g_free(elem); g_free(elem);
return; return;
} }
@ -348,6 +350,7 @@ static void virtio_mem_handle_request(VirtIODevice *vdev, VirtQueue *vq)
default: default:
virtio_error(vdev, "virtio-mem protocol violation: unknown request" virtio_error(vdev, "virtio-mem protocol violation: unknown request"
" type: %d", type); " type: %d", type);
virtqueue_detach_element(vq, elem, 0);
g_free(elem); g_free(elem);
return; return;
} }