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: [email protected]
> Cc: Michael S. Tsirkin <[email protected]>
> Signed-off-by: Jason Wang <[email protected]>
> ---
> 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