Message ID | 1432879994-28344-1-git-send-email-jasowang@redhat.com |
---|---|
State | New |
Headers | show |
On 05/29/2015 02:13 PM, Jason Wang wrote: > We override the error value r in fail_vq, this will cause the caller > can't detect the failure which may cause the caller may disable the > notifiers twice if vhost is failed to start. Fix this by using another > variable to keep track the return value of set_host_notifier(). > > Fixes b0b3db79559e57db340b292621c397e7a6cdbdc5 ("vhost-net: cleanup > host notifiers at last step") > > Cc: qemu-stable@nongnu.org > Cc: Michael S. Tsirkin <mst@redhat.com> > Signed-off-by: Jason Wang <jasowang@redhat.com> > --- > hw/virtio/vhost.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index 54851b7..a7858d3 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -921,7 +921,7 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) > BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); > VirtioBusState *vbus = VIRTIO_BUS(qbus); > VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); > - int i, r; > + int i, r, e; > if (!k->set_host_notifier) { > fprintf(stderr, "binding does not support host notifiers\n"); > r = -ENOSYS; > @@ -939,12 +939,12 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) > return 0; > fail_vq: > while (--i >= 0) { > - r = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false); > - if (r < 0) { > + e = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false); > + if (e < 0) { > fprintf(stderr, "vhost VQ %d notifier cleanup error: %d\n", i, -r); > fflush(stderr); > } > - assert (r >= 0); > + assert (e >= 0); > } > fail: > return r; Ping
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 54851b7..a7858d3 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -921,7 +921,7 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev))); VirtioBusState *vbus = VIRTIO_BUS(qbus); VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); - int i, r; + int i, r, e; if (!k->set_host_notifier) { fprintf(stderr, "binding does not support host notifiers\n"); r = -ENOSYS; @@ -939,12 +939,12 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) return 0; fail_vq: while (--i >= 0) { - r = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false); - if (r < 0) { + e = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false); + if (e < 0) { fprintf(stderr, "vhost VQ %d notifier cleanup error: %d\n", i, -r); fflush(stderr); } - assert (r >= 0); + assert (e >= 0); } fail: return r;
We override the error value r in fail_vq, this will cause the caller can't detect the failure which may cause the caller may disable the notifiers twice if vhost is failed to start. Fix this by using another variable to keep track the return value of set_host_notifier(). Fixes b0b3db79559e57db340b292621c397e7a6cdbdc5 ("vhost-net: cleanup host notifiers at last step") Cc: qemu-stable@nongnu.org Cc: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> --- hw/virtio/vhost.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)