diff mbox

[07/18] virtio: Return error from virtqueue_avail_bytes

Message ID 1429257573-7359-8-git-send-email-famz@redhat.com
State New
Headers show

Commit Message

Fam Zheng April 17, 2015, 7:59 a.m. UTC
The only caller is virtio-net, which now passes in error_abort.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 hw/net/virtio-net.c        | 4 ++--
 hw/virtio/virtio.c         | 9 +++++++--
 include/hw/virtio/virtio.h | 2 +-
 3 files changed, 10 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index bbcb51f..5529b6f 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -877,7 +877,7 @@  static int virtio_net_has_buffers(VirtIONetQueue *q, int bufsize)
     VirtIONet *n = q->n;
     if (virtio_queue_empty(q->rx_vq) ||
         (n->mergeable_rx_bufs &&
-         !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
+         !virtqueue_avail_bytes(q->rx_vq, bufsize, 0, &error_abort))) {
         virtio_queue_set_notification(q->rx_vq, 1);
 
         /* To avoid a race condition where the guest has made some buffers
@@ -886,7 +886,7 @@  static int virtio_net_has_buffers(VirtIONetQueue *q, int bufsize)
          */
         if (virtio_queue_empty(q->rx_vq) ||
             (n->mergeable_rx_bufs &&
-             !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) {
+             !virtqueue_avail_bytes(q->rx_vq, bufsize, 0, &error_abort))) {
             return 0;
         }
     }
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index e6f9f6b..7c5ca07 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -443,12 +443,17 @@  done:
 }
 
 int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
-                          unsigned int out_bytes)
+                          unsigned int out_bytes, Error **errp)
 {
+    Error *local_err = NULL;
     unsigned int in_total, out_total;
 
     virtqueue_get_avail_bytes(vq, &in_total, &out_total, in_bytes, out_bytes,
-                              &error_abort);
+                              &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return -EINVAL;
+    }
     return in_bytes <= in_total && out_bytes <= out_total;
 }
 
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index c478f48..34fb62c 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -144,7 +144,7 @@  void virtqueue_map_sg(struct iovec *sg, hwaddr *addr,
                       Error **errp);
 int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem, Error **errp);
 int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
-                          unsigned int out_bytes);
+                          unsigned int out_bytes, Error **errp);
 void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
                                unsigned int *out_bytes,
                                unsigned max_in_bytes, unsigned max_out_bytes,