Replace the proliferation of exit labels in vfio_container_connect with conditionals for cleaning each piece of state. No functional change.
Signed-off-by: Steve Sistare <steven.sist...@oracle.com> Reviewed-by: Cedric Le Goater <c...@redhat.com> --- hw/vfio/container.c | 60 +++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/hw/vfio/container.c b/hw/vfio/container.c index bf4bbd2..26433ae 100644 --- a/hw/vfio/container.c +++ b/hw/vfio/container.c @@ -563,9 +563,12 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as, { VFIOContainer *container; VFIOContainerBase *bcontainer; - int ret, fd; + int ret, fd = -1; VFIOAddressSpace *space; - VFIOIOMMUClass *vioc; + VFIOIOMMUClass *vioc = NULL; + bool new_container = false; + bool group_was_added = false; + bool discard_disabled = false; space = vfio_address_space_get(as); @@ -584,35 +587,37 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as, fd = qemu_open("/dev/vfio/vfio", O_RDWR, errp); if (fd < 0) { - goto put_space_exit; + goto fail; } ret = ioctl(fd, VFIO_GET_API_VERSION); if (ret != VFIO_API_VERSION) { error_setg(errp, "supported vfio version: %d, " "reported version: %d", VFIO_API_VERSION, ret); - goto close_fd_exit; + goto fail; } container = vfio_create_container(fd, group, errp); if (!container) { - goto close_fd_exit; + goto fail; } + new_container = true; bcontainer = &container->bcontainer; if (!vfio_cpr_register_container(bcontainer, errp)) { - goto free_container_exit; + goto fail; } if (!vfio_attach_discard_disable(container, group, errp)) { - goto unregister_container_exit; + goto fail; } + discard_disabled = true; vioc = VFIO_IOMMU_GET_CLASS(bcontainer); assert(vioc->setup); if (!vioc->setup(bcontainer, errp)) { - goto enable_discards_exit; + goto fail; } vfio_group_add_kvm_device(group); @@ -621,35 +626,36 @@ static bool vfio_container_connect(VFIOGroup *group, AddressSpace *as, group->container = container; QLIST_INSERT_HEAD(&container->group_list, group, container_next); + group_was_added = true; if (!vfio_listener_register(bcontainer, errp)) { - goto listener_release_exit; + goto fail; } bcontainer->initialized = true; return true; -listener_release_exit: - QLIST_REMOVE(group, container_next); - vfio_group_del_kvm_device(group); + +fail: vfio_listener_unregister(bcontainer); - if (vioc->release) { + + if (group_was_added) { + QLIST_REMOVE(group, container_next); + vfio_group_del_kvm_device(group); + } + if (vioc && vioc->release) { vioc->release(bcontainer); } - -enable_discards_exit: - vfio_ram_block_discard_disable(container, false); - -unregister_container_exit: - vfio_cpr_unregister_container(bcontainer); - -free_container_exit: - object_unref(container); - -close_fd_exit: - close(fd); - -put_space_exit: + if (discard_disabled) { + vfio_ram_block_discard_disable(container, false); + } + if (new_container) { + vfio_cpr_unregister_container(bcontainer); + object_unref(container); + } + if (fd >= 0) { + close(fd); + } vfio_address_space_put(space); return false; -- 1.8.3.1