vhost: correctly pass error to caller in vhost_dev_enable_notifiers()
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(). Fixesb0b3db7955
("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> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> (cherry picked from commit16617e36b0
) Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
6130c46232
commit
81cb0a5657
|
@ -921,7 +921,7 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev)
|
||||||
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
||||||
VirtioBusState *vbus = VIRTIO_BUS(qbus);
|
VirtioBusState *vbus = VIRTIO_BUS(qbus);
|
||||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
|
||||||
int i, r;
|
int i, r, e;
|
||||||
if (!k->set_host_notifier) {
|
if (!k->set_host_notifier) {
|
||||||
fprintf(stderr, "binding does not support host notifiers\n");
|
fprintf(stderr, "binding does not support host notifiers\n");
|
||||||
r = -ENOSYS;
|
r = -ENOSYS;
|
||||||
|
@ -939,12 +939,12 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev)
|
||||||
return 0;
|
return 0;
|
||||||
fail_vq:
|
fail_vq:
|
||||||
while (--i >= 0) {
|
while (--i >= 0) {
|
||||||
r = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false);
|
e = k->set_host_notifier(qbus->parent, hdev->vq_index + i, false);
|
||||||
if (r < 0) {
|
if (e < 0) {
|
||||||
fprintf(stderr, "vhost VQ %d notifier cleanup error: %d\n", i, -r);
|
fprintf(stderr, "vhost VQ %d notifier cleanup error: %d\n", i, -r);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
}
|
}
|
||||||
assert (r >= 0);
|
assert (e >= 0);
|
||||||
}
|
}
|
||||||
fail:
|
fail:
|
||||||
return r;
|
return r;
|
||||||
|
|
Loading…
Reference in New Issue