fix vhost_user_blk_watch crash
the G_IO_HUP is watched in tcp_chr_connect, and the callback vhost_user_blk_watch is not needed, because tcp_chr_hup is registered as callback. And it will close the tcp link. Signed-off-by: Li Feng <fengli@smartx.com> Message-Id: <20200323052924.29286-1-fengli@smartx.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
32a2d6b1f6
commit
9d283f85d7
@ -349,18 +349,6 @@ static void vhost_user_blk_disconnect(DeviceState *dev)
|
|||||||
vhost_dev_cleanup(&s->dev);
|
vhost_dev_cleanup(&s->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean vhost_user_blk_watch(GIOChannel *chan, GIOCondition cond,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
DeviceState *dev = opaque;
|
|
||||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
|
||||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
|
||||||
|
|
||||||
qemu_chr_fe_disconnect(&s->chardev);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
||||||
{
|
{
|
||||||
DeviceState *dev = opaque;
|
DeviceState *dev = opaque;
|
||||||
@ -373,15 +361,9 @@ static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
|||||||
qemu_chr_fe_disconnect(&s->chardev);
|
qemu_chr_fe_disconnect(&s->chardev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s->watch = qemu_chr_fe_add_watch(&s->chardev, G_IO_HUP,
|
|
||||||
vhost_user_blk_watch, dev);
|
|
||||||
break;
|
break;
|
||||||
case CHR_EVENT_CLOSED:
|
case CHR_EVENT_CLOSED:
|
||||||
vhost_user_blk_disconnect(dev);
|
vhost_user_blk_disconnect(dev);
|
||||||
if (s->watch) {
|
|
||||||
g_source_remove(s->watch);
|
|
||||||
s->watch = 0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case CHR_EVENT_BREAK:
|
case CHR_EVENT_BREAK:
|
||||||
case CHR_EVENT_MUX_IN:
|
case CHR_EVENT_MUX_IN:
|
||||||
@ -428,7 +410,6 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
|
|||||||
|
|
||||||
s->inflight = g_new0(struct vhost_inflight, 1);
|
s->inflight = g_new0(struct vhost_inflight, 1);
|
||||||
s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues);
|
s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues);
|
||||||
s->watch = 0;
|
|
||||||
s->connected = false;
|
s->connected = false;
|
||||||
|
|
||||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event,
|
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event,
|
||||||
|
@ -38,7 +38,6 @@ typedef struct VHostUserBlk {
|
|||||||
VhostUserState vhost_user;
|
VhostUserState vhost_user;
|
||||||
struct vhost_virtqueue *vhost_vqs;
|
struct vhost_virtqueue *vhost_vqs;
|
||||||
VirtQueue **virtqs;
|
VirtQueue **virtqs;
|
||||||
guint watch;
|
|
||||||
bool connected;
|
bool connected;
|
||||||
} VHostUserBlk;
|
} VHostUserBlk;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user