Message ID | 20190717004606.12444-2-xieyongji@baidu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/2] vhost-scsi: Call virtio_scsi_common_unrealize() when device realize failed | expand |
On 17/07/19 02:46, elohimes@gmail.com wrote: > From: Xie Yongji <xieyongji@baidu.com> > > This avoids memory leak when device hotplug is failed. > > Signed-off-by: Xie Yongji <xieyongji@baidu.com> > --- > hw/scsi/vhost-user-scsi.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c > index a9fd8ea305..17826ef8e2 100644 > --- a/hw/scsi/vhost-user-scsi.c > +++ b/hw/scsi/vhost-user-scsi.c > @@ -87,7 +87,7 @@ static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) > } > > if (!vhost_user_init(&s->vhost_user, &vs->conf.chardev, errp)) { > - return; > + goto free_virtio; > } > > vsc->dev.nvqs = 2 + vs->conf.num_queues; > @@ -101,15 +101,23 @@ static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) > if (ret < 0) { > error_setg(errp, "vhost-user-scsi: vhost initialization failed: %s", > strerror(-ret)); > - vhost_user_cleanup(&s->vhost_user); > - g_free(vqs); > - return; > + goto free_vhost; > } > > /* Channel and lun both are 0 for bootable vhost-user-scsi disk */ > vsc->channel = 0; > vsc->lun = 0; > vsc->target = vs->conf.boot_tpgt; > + > + return; > + > +free_vhost: > + vhost_user_cleanup(&s->vhost_user); > + g_free(vqs); > +free_virtio: > + err = NULL; > + virtio_scsi_common_unrealize(dev, &err); > + error_propagate(errp, err); > } > > static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp) > Queued both patches, thanks. Paolo
diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c index a9fd8ea305..17826ef8e2 100644 --- a/hw/scsi/vhost-user-scsi.c +++ b/hw/scsi/vhost-user-scsi.c @@ -87,7 +87,7 @@ static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) } if (!vhost_user_init(&s->vhost_user, &vs->conf.chardev, errp)) { - return; + goto free_virtio; } vsc->dev.nvqs = 2 + vs->conf.num_queues; @@ -101,15 +101,23 @@ static void vhost_user_scsi_realize(DeviceState *dev, Error **errp) if (ret < 0) { error_setg(errp, "vhost-user-scsi: vhost initialization failed: %s", strerror(-ret)); - vhost_user_cleanup(&s->vhost_user); - g_free(vqs); - return; + goto free_vhost; } /* Channel and lun both are 0 for bootable vhost-user-scsi disk */ vsc->channel = 0; vsc->lun = 0; vsc->target = vs->conf.boot_tpgt; + + return; + +free_vhost: + vhost_user_cleanup(&s->vhost_user); + g_free(vqs); +free_virtio: + err = NULL; + virtio_scsi_common_unrealize(dev, &err); + error_propagate(errp, err); } static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp)