[libvirt] [PATCH v2 06/10] vz: introduce new vzDriver lockable structure and use it

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Tue Apr 12 11:11:38 UTC 2016



On 07.04.2016 23:09, Maxim Nestratov wrote:
> This patch introduces a new 'vzDriver' lockable object and provides
> helper functions to allocate/destroy it and we pass it to prlsdkXxx
> functions instead of virConnectPtr.
> Now we store domain related objects such as domain list, capabitilies
> etc. within a single vz_driver vzDriver structure, which is shared by
> all driver connections. It is allocated during daemon initialization or
> in a lazy manner when a new connection to 'vz' driver is established.
> When a connection to vz daemon drops, vzDestroyConnection is called,
> which in turn relays disconnect event to all connection to 'vz' driver.
> 
> Signed-off-by: Maxim Nestratov <mnestratov at virtuozzo.com>
> ---
>  src/vz/vz_driver.c | 339 +++++++++++++++++++++++++++++++++++------------------
>  src/vz/vz_sdk.c    | 211 ++++++++++++++++-----------------
>  src/vz/vz_sdk.h    |  30 ++---
>  src/vz/vz_utils.c  |  27 +++--
>  src/vz/vz_utils.h  |  29 ++++-
>  5 files changed, 380 insertions(+), 256 deletions(-)
> 
> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c
> index f2bbf1e..e9fe89f 100644
> --- a/src/vz/vz_driver.c
> +++ b/src/vz/vz_driver.c
> @@ -63,18 +63,25 @@ VIR_LOG_INIT("parallels.parallels_driver");
>  #define PRLCTL                      "prlctl"
>  
>  static int vzConnectClose(virConnectPtr conn);
> +static virClassPtr vzDriverConnClass;

why 'conn' suffix? i suggest just vzDriverClass

>  
>  void
> -vzDriverLock(vzConnPtr driver)
> +vzDriverLock(vzConnPtr privconn)
>  {
> -    virMutexLock(&driver->lock);
> +    virObjectLock(privconn->driver);
>  }
>  
>  void
> -vzDriverUnlock(vzConnPtr driver)
> +vzDriverUnlock(vzConnPtr privconn)
>  {
> -    virMutexUnlock(&driver->lock);
> +    virObjectUnlock(privconn->driver);
>  }

empty line here will be good

> +static virMutex vz_driver_lock;
> +static vzDriverPtr vz_driver;
> +static vzConnPtr vz_conn_list;

i would move this list into driver,
i even think if we could write version of close callback object
that can take multiple callbacks, thus we can get rid of vz_conn_list
and vzConn altogether.

> +
> +static vzDriverPtr
> +vzDriverObjNew(void);
>  
>  static int
>  vzCapsAddGuestDomain(virCapsPtr caps,
> @@ -158,6 +165,69 @@ vzBuildCapabilities(void)
>      goto cleanup;
>  }
>  
> +static void vzDriverDispose(void * obj)
> +{
> +    vzDriverPtr conn = obj;

looks like 'driver' will be better here

> +
> +    if (conn->server) {
> +        prlsdkUnsubscribeFromPCSEvents(conn);
> +        prlsdkDisconnect(conn);
> +    }
> +
> +    virObjectUnref(conn->domains);
> +    virObjectUnref(conn->caps);
> +    virObjectUnref(conn->xmlopt);
> +    virObjectEventStateFree(conn->domainEventState);
> +}
> +
> +static int vzDriverOnceInit(void)
> +{
> +    if (!(vzDriverConnClass = virClassNew(virClassForObjectLockable(),
> +                                    "vzDriver",
> +                                    sizeof(vzDriver),
> +                                    vzDriverDispose)))

indentation

> +        return -1;
> +
> +    return 0;
> +}
> +VIR_ONCE_GLOBAL_INIT(vzDriver)
> +
> +vzDriverPtr
> +vzGetDriverConnection(void)
> +{
> +    virMutexLock(&vz_driver_lock);
> +    if (!vz_driver)
> +        vz_driver = vzDriverObjNew();
> +    virObjectRef(vz_driver);
> +    virMutexUnlock(&vz_driver_lock);
> +    return vz_driver;
> +}

i would put more empty lines here,
and since this func is pretty simple i suggest open code it in that new function

> +
> +void
> +vzDestroyDriverConnection(void)
> +{
> +
> +    vzDriverPtr driver;
> +    vzConnPtr privconn_list;
> +
> +    virMutexLock(&vz_driver_lock);
> +    driver = vz_driver;
> +    vz_driver = NULL;
> +
> +    privconn_list = vz_conn_list;
> +    vz_conn_list = NULL;
> +
> +    virMutexUnlock(&vz_driver_lock);
> +
> +    while (privconn_list) {
> +        vzConnPtr privconn = privconn_list;
> +        privconn_list = privconn->next;
> +        virConnectCloseCallbackDataCall(privconn->closeCallback,
> +                                        VIR_CONNECT_CLOSE_REASON_EOF);
> +    }
> +    virObjectUnref(driver);
> +}
> +
>  static char *
>  vzConnectGetCapabilities(virConnectPtr conn)
>  {
> @@ -165,7 +235,7 @@ vzConnectGetCapabilities(virConnectPtr conn)
>      char *xml;
>  
>      vzDriverLock(privconn);
> -    xml = virCapabilitiesFormatXML(privconn->caps);
> +    xml = virCapabilitiesFormatXML(privconn->driver->caps);
>      vzDriverUnlock(privconn);
>      return xml;
>  }
> @@ -214,70 +284,34 @@ virDomainDefParserConfig vzDomainDefParserConfig = {
>      .domainPostParseCallback = vzDomainDefPostParse,
>  };
>  
> -
> -static int
> -vzOpenDefault(virConnectPtr conn)
> +static vzDriverPtr
> +vzDriverObjNew(void)
>  {
> -    vzConnPtr privconn;
> -
> -    if (VIR_ALLOC(privconn) < 0)
> -        return VIR_DRV_OPEN_ERROR;
> -    if (virMutexInit(&privconn->lock) < 0) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("cannot initialize mutex"));
> -        goto err_free;
> -    }
> +    vzDriverPtr conn;

i think 'driver' will be more comprehensible

>  
> -    if (prlsdkInit()) {
> -        VIR_DEBUG("%s", _("Can't initialize Parallels SDK"));
> -        goto err_free;
> -    }
> -
> -    if (prlsdkConnect(privconn) < 0)
> -        goto err_free;
> -
> -    if (vzInitVersion(privconn) < 0)
> -        goto error;
> -
> -    if (!(privconn->caps = vzBuildCapabilities()))
> -        goto error;
> -
> -    vzDomainDefParserConfig.priv = &privconn->vzCaps;
> -    if (!(privconn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
> -                                                   NULL, NULL)))
> -        goto error;
> -
> -    if (!(privconn->domains = virDomainObjListNew()))
> -        goto error;
> -
> -    if (!(privconn->domainEventState = virObjectEventStateNew()))
> -        goto error;
> -
> -    if (prlsdkSubscribeToPCSEvents(privconn))
> -        goto error;
> -
> -    if (!(privconn->closeCallback = virNewConnectCloseCallbackData()))
> -        goto error;
> -
> -    conn->privateData = privconn;
> +    if (vzDriverInitialize() < 0)
> +        return NULL;
>  
> -    if (prlsdkLoadDomains(privconn))
> -        goto error;
> +    if (!(conn = virObjectLockableNew(vzDriverConnClass)))
> +        return NULL;
>  
> -    return VIR_DRV_OPEN_SUCCESS;
> +    vzDomainDefParserConfig.priv = &conn->vzCaps;
> +
> +    if (!(conn->caps = vzBuildCapabilities()) ||
> +        !(conn->xmlopt = virDomainXMLOptionNew(&vzDomainDefParserConfig,
> +                                                   NULL, NULL)) ||
> +        !(conn->domains = virDomainObjListNew()) ||
> +        !(conn->domainEventState = virObjectEventStateNew()) ||
> +        (vzInitVersion(conn) < 0) ||
> +        (prlsdkConnect(conn) < 0) ||
> +        (prlsdkSubscribeToPCSEvents(conn) < 0)
> +        ) {
> +        virObjectUnref(conn);
> +        return NULL;
> +    }
>  
> - error:
> -    virObjectUnref(privconn->closeCallback);
> -    privconn->closeCallback = NULL;
> -    virObjectUnref(privconn->domains);
> -    virObjectUnref(privconn->caps);
> -    virObjectEventStateFree(privconn->domainEventState);
> -    prlsdkDisconnect(privconn);
> -    prlsdkDeinit();
> - err_free:
> -    conn->privateData = NULL;
> -    VIR_FREE(privconn);
> -    return VIR_DRV_OPEN_ERROR;
> +    prlsdkLoadDomains(conn);

failure should be checked

> +    return conn;
>  }
>  
>  static virDrvOpenStatus
> @@ -285,7 +319,8 @@ vzConnectOpen(virConnectPtr conn,
>                virConnectAuthPtr auth ATTRIBUTE_UNUSED,
>                unsigned int flags)
>  {
> -    int ret;
> +    vzDriverPtr driver = NULL;
> +    vzConnPtr privconn = NULL;
>  
>      virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
>  
> @@ -317,36 +352,60 @@ vzConnectOpen(virConnectPtr conn,
>          return VIR_DRV_OPEN_ERROR;
>      }
>  
> -    if ((ret = vzOpenDefault(conn)) != VIR_DRV_OPEN_SUCCESS)
> -        return ret;
> +    if (!(driver = vzGetDriverConnection()))
> +        return VIR_DRV_OPEN_ERROR;
> +
> +    if (VIR_ALLOC(privconn) < 0) {
> +
> +        virObjectUnref(driver);
> +        return VIR_DRV_OPEN_ERROR;
> +    }

you can just goto error here

> +
> +    conn->privateData = privconn;
> +    privconn->driver = driver;
> +
> +    if (!(privconn->closeCallback = virNewConnectCloseCallbackData()))
> +        goto error;
> +
> +    virMutexLock(&vz_driver_lock);
> +    privconn->next = vz_conn_list;
> +    vz_conn_list = privconn;
> +    virMutexUnlock(&vz_driver_lock);
>  
>      return VIR_DRV_OPEN_SUCCESS;
> +
> + error:
> +
> +    conn->privateData = NULL;
> +    virObjectUnref(driver);
> +    VIR_FREE(privconn);
> +    return VIR_DRV_OPEN_ERROR;
>  }
>  
>  static int
>  vzConnectClose(virConnectPtr conn)
>  {
> +    vzConnPtr curr, prev = NULL;
>      vzConnPtr privconn = conn->privateData;
>  
>      if (!privconn)
>          return 0;
>  
> -    vzDriverLock(privconn);
> -    prlsdkUnsubscribeFromPCSEvents(privconn);
> -    virObjectUnref(privconn->caps);
> -    virObjectUnref(privconn->xmlopt);
> -    virObjectUnref(privconn->domains);
> -    virObjectUnref(privconn->closeCallback);
> -    privconn->closeCallback = NULL;
> -    virObjectEventStateFree(privconn->domainEventState);
> -    prlsdkDisconnect(privconn);
> -    conn->privateData = NULL;
> -    prlsdkDeinit();
> -
> -    vzDriverUnlock(privconn);
> -    virMutexDestroy(&privconn->lock);
> +    virMutexLock(&vz_driver_lock);
> +    for (curr = vz_conn_list; curr; prev = curr, curr = curr->next)
> +        if (curr == privconn) {
> +            if (prev)
> +                prev->next = curr->next;
> +            else
> +                vz_conn_list = curr->next;
> +            break;
> +        }

i'd suggest use braces here for 'for' too, BTW you can reduce nesting

> +    virMutexUnlock(&vz_driver_lock);
>  
> +    virObjectUnref(privconn->closeCallback);
> +    virObjectUnref(privconn->driver);
>      VIR_FREE(privconn);
> +    conn->privateData = NULL;
>      return 0;
>  }
>  
> @@ -354,7 +413,7 @@ static int
>  vzConnectGetVersion(virConnectPtr conn, unsigned long *hvVer)
>  {
>      vzConnPtr privconn = conn->privateData;
> -    *hvVer = privconn->vzVersion;
> +    *hvVer = privconn->driver->vzVersion;
>      return 0;
>  }
>  
> @@ -372,7 +431,7 @@ vzConnectListDomains(virConnectPtr conn, int *ids, int maxids)
>      int n;
>  
>      vzDriverLock(privconn);
> -    n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids,
> +    n = virDomainObjListGetActiveIDs(privconn->driver->domains, ids, maxids,
>                                       NULL, NULL);
>      vzDriverUnlock(privconn);
>  
> @@ -386,7 +445,7 @@ vzConnectNumOfDomains(virConnectPtr conn)
>      int count;
>  
>      vzDriverLock(privconn);
> -    count = virDomainObjListNumOfDomains(privconn->domains, true,
> +    count = virDomainObjListNumOfDomains(privconn->driver->domains, true,
>                                           NULL, NULL);
>      vzDriverUnlock(privconn);
>  
> @@ -394,14 +453,16 @@ vzConnectNumOfDomains(virConnectPtr conn)
>  }
>  
>  static int
> -vzConnectListDefinedDomains(virConnectPtr conn, char **const names, int maxnames)
> +vzConnectListDefinedDomains(virConnectPtr conn,
> +                            char **const names,
> +                            int maxnames)

unrelated

>  {
>      vzConnPtr privconn = conn->privateData;
>      int n;
>  
>      vzDriverLock(privconn);
>      memset(names, 0, sizeof(*names) * maxnames);
> -    n = virDomainObjListGetInactiveNames(privconn->domains, names,
> +    n = virDomainObjListGetInactiveNames(privconn->driver->domains, names,
>                                           maxnames, NULL, NULL);
>      vzDriverUnlock(privconn);
>  
> @@ -415,7 +476,7 @@ vzConnectNumOfDefinedDomains(virConnectPtr conn)
>      int count;
>  
>      vzDriverLock(privconn);
> -    count = virDomainObjListNumOfDomains(privconn->domains, false,
> +    count = virDomainObjListNumOfDomains(privconn->driver->domains, false,
>                                           NULL, NULL);
>      vzDriverUnlock(privconn);
>  
> @@ -432,7 +493,7 @@ vzConnectListAllDomains(virConnectPtr conn,
>  
>      virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1);
>      vzDriverLock(privconn);
> -    ret = virDomainObjListExport(privconn->domains, conn, domains,
> +    ret = virDomainObjListExport(privconn->driver->domains, conn, domains,
>                                   NULL, flags);
>      vzDriverUnlock(privconn);
>  
> @@ -447,7 +508,7 @@ vzDomainLookupByID(virConnectPtr conn, int id)
>      virDomainObjPtr dom;
>  
>      vzDriverLock(privconn);
> -    dom = virDomainObjListFindByID(privconn->domains, id);
> +    dom = virDomainObjListFindByID(privconn->driver->domains, id);
>      vzDriverUnlock(privconn);
>  
>      if (dom == NULL) {
> @@ -473,7 +534,8 @@ vzDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
>      virDomainObjPtr dom;
>  
>      vzDriverLock(privconn);
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +
> +    dom = virDomainObjListFindByUUID(privconn->driver->domains, uuid);
>      vzDriverUnlock(privconn);
>  
>      if (dom == NULL) {
> @@ -502,7 +564,7 @@ vzDomainLookupByName(virConnectPtr conn, const char *name)
>      virDomainObjPtr dom;
>  
>      vzDriverLock(privconn);
> -    dom = virDomainObjListFindByName(privconn->domains, name);
> +    dom = virDomainObjListFindByName(privconn->driver->domains, name);
>      vzDriverUnlock(privconn);
>  
>      if (dom == NULL) {
> @@ -626,7 +688,7 @@ vzDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
>      def = (flags & VIR_DOMAIN_XML_INACTIVE) &&
>          privdom->newDef ? privdom->newDef : privdom->def;
>  
> -    ret = virDomainDefFormat(def, privconn->caps, flags);
> +    ret = virDomainDefFormat(def, privconn->driver->caps, flags);
>  
>   cleanup:
>      if (privdom)
> @@ -661,28 +723,29 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
>      virDomainObjPtr olddom = NULL;
>      virDomainObjPtr newdom = NULL;
>      unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
> +    vzDriverPtr driver = privconn->driver;
>  
>      virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL);
>  
>      if (flags & VIR_DOMAIN_DEFINE_VALIDATE)
>          parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE;
>  
> -    vzDriverLock(privconn);
> -    if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt,
> +    virObjectLock(driver);
> +    if ((def = virDomainDefParseString(xml, driver->caps, driver->xmlopt,
>                                         parse_flags)) == NULL)
>          goto cleanup;
>  
> -    olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
> +    olddom = virDomainObjListFindByUUID(driver->domains, def->uuid);
>      if (olddom == NULL) {
>          virResetLastError();
> -        newdom = vzNewDomain(privconn, def->name, def->uuid);
> +        newdom = vzNewDomain(driver, def->name, def->uuid);
>          if (!newdom)
>              goto cleanup;
>          if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
> -            if (prlsdkCreateVm(conn, def))
> +            if (prlsdkCreateVm(driver, def))
>                  goto cleanup;
>          } else if (def->os.type == VIR_DOMAIN_OSTYPE_EXE) {
> -            if (prlsdkCreateCt(conn, def))
> +            if (prlsdkCreateCt(driver, def))
>                  goto cleanup;
>          } else {
>              virReportError(VIR_ERR_INVALID_ARG,
> @@ -691,7 +754,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
>              goto cleanup;
>          }
>  
> -        if (prlsdkLoadDomain(privconn, newdom))
> +        if (prlsdkLoadDomain(driver, newdom))
>              goto cleanup;
>      } else {
>          int state, reason;
> @@ -717,10 +780,10 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
>                  goto cleanup;
>              }
>          } else {
> -            if (prlsdkApplyConfig(conn, olddom, def))
> +            if (prlsdkApplyConfig(driver, olddom, def))
>                  goto cleanup;
>  
> -            if (prlsdkUpdateDomain(privconn, olddom))
> +            if (prlsdkUpdateDomain(driver, olddom))
>                  goto cleanup;
>          }
>      }
> @@ -734,12 +797,12 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags)
>          virObjectUnlock(olddom);
>      if (newdom) {
>          if (!retdom)
> -             virDomainObjListRemove(privconn->domains, newdom);
> +             virDomainObjListRemove(driver->domains, newdom);
>          else
>               virObjectUnlock(newdom);
>      }
>      virDomainDefFree(def);
> -    vzDriverUnlock(privconn);
> +    virObjectUnlock(driver);
>      return retdom;
>  }
>  
> @@ -855,7 +918,7 @@ vzConnectDomainEventRegisterAny(virConnectPtr conn,
>      int ret = -1;
>      vzConnPtr privconn = conn->privateData;
>      if (virDomainEventStateRegisterID(conn,
> -                                      privconn->domainEventState,
> +                                      privconn->driver->domainEventState,
>                                        domain, eventID,
>                                        callback, opaque, freecb, &ret) < 0)
>          ret = -1;
> @@ -870,7 +933,7 @@ vzConnectDomainEventDeregisterAny(virConnectPtr conn,
>      int ret = -1;
>  
>      if (virObjectEventStateDeregisterID(conn,
> -                                        privconn->domainEventState,
> +                                        privconn->driver->domainEventState,
>                                          callbackID) < 0)
>          goto cleanup;
>  
> @@ -949,7 +1012,7 @@ vzDomainUndefineFlags(virDomainPtr domain,
>      if (!(dom = vzDomObjFromDomain(domain)))
>          return -1;
>  
> -    ret = prlsdkUnregisterDomain(privconn, dom, flags);
> +    ret = prlsdkUnregisterDomain(privconn->driver, dom, flags);
>      if (ret)
>          virObjectUnlock(dom);
>  
> @@ -999,12 +1062,12 @@ vzDomainManagedSave(virDomainPtr domain, unsigned int flags)
>      state = virDomainObjGetState(dom, &reason);
>  
>      if (state == VIR_DOMAIN_RUNNING && (flags & VIR_DOMAIN_SAVE_PAUSED)) {
> -        ret = prlsdkDomainChangeStateLocked(privconn, dom, prlsdkPause);
> +        ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, prlsdkPause);
>          if (ret)
>              goto cleanup;
>      }
>  
> -    ret = prlsdkDomainChangeStateLocked(privconn, dom, prlsdkSuspend);
> +    ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, prlsdkSuspend);
>  
>   cleanup:
>      virObjectUnlock(dom);
> @@ -1070,14 +1133,14 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>                           "VIR_DOMAIN_AFFECT_LIVE flag"));
>      }
>  
> -    dev = virDomainDeviceDefParse(xml, privdom->def, privconn->caps,
> -                                  privconn->xmlopt, VIR_DOMAIN_XML_INACTIVE);
> +    dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps,
> +                                  privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE);
>      if (dev == NULL)
>          goto cleanup;
>  
>      switch (dev->type) {
>      case VIR_DOMAIN_DEVICE_DISK:
> -        ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk);
> +        ret = prlsdkAttachVolume(privconn->driver, privdom, dev->data.disk);
>          if (ret) {
>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                             _("disk attach failed"));
> @@ -1085,7 +1148,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
>          }
>          break;
>      case VIR_DOMAIN_DEVICE_NET:
> -        ret = prlsdkAttachNet(privconn, privdom, dev->data.net);
> +        ret = prlsdkAttachNet(privconn->driver, privdom, dev->data.net);
>          if (ret) {
>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                             _("network attach failed"));
> @@ -1147,8 +1210,8 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>                           "VIR_DOMAIN_AFFECT_LIVE flag"));
>      }
>  
> -    dev = virDomainDeviceDefParse(xml, privdom->def, privconn->caps,
> -                                  privconn->xmlopt, VIR_DOMAIN_XML_INACTIVE);
> +    dev = virDomainDeviceDefParse(xml, privdom->def, privconn->driver->caps,
> +                                  privconn->driver->xmlopt, VIR_DOMAIN_XML_INACTIVE);
>      if (dev == NULL)
>          goto cleanup;

looks like it's worth introducing driver var here

>  
> @@ -1162,7 +1225,7 @@ static int vzDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
>          }
>          break;
>      case VIR_DOMAIN_DEVICE_NET:
> -        ret = prlsdkDetachNet(privconn, privdom, dev->data.net);
> +        ret = prlsdkDetachNet(privconn->driver, privdom, dev->data.net);
>          if (ret) {
>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>                             _("network detach failed"));
> @@ -1451,7 +1514,6 @@ vzConnectRegisterCloseCallback(virConnectPtr conn,
>      int ret = -1;
>  
>      vzDriverLock(privconn);
> -

unrelated

>      if (virConnectCloseCallbackDataGetCallback(privconn->closeCallback) != NULL) {
>          virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>                         _("A close callback is already registered"));
> @@ -1561,6 +1623,48 @@ static virConnectDriver vzConnectDriver = {
>      .hypervisorDriver = &vzHypervisorDriver,
>  };
>  
> +static int
> +vzStateCleanup(void)
> +{
> +    prlsdkDeinit();

i think this should go after unreferencing driver which in turn
destroy driver object and call some sdk cleanup logic  

> +    virObjectUnref(vz_driver);
> +    vz_driver = NULL;
> +    virMutexDestroy(&vz_driver_lock);
> +    return 0;
> +}
> +
> +static int
> +vzStateInitialize(bool privileged ATTRIBUTE_UNUSED,
> +                  virStateInhibitCallback callback ATTRIBUTE_UNUSED,
> +                  void *opaque ATTRIBUTE_UNUSED)
> +{
> +    if (!privileged) {
> +        VIR_INFO("Not running privileged, disabling driver");
> +        return 0;
> +    }

why is this success?

> +
> +    if (prlsdkInit() < 0) {
> +        VIR_DEBUG("%s", _("Can't initialize Parallels SDK"));

look like you need to report error here

> +        return -1;
> +    }
> +
> +   if (virMutexInit(&vz_driver_lock) < 0)

and here

> +        goto error;
> +
> +    vz_driver = vzDriverObjNew();

looks like it is not a problem if we get NULL as we are lazy,
i think this should be commented

> +    return 0;
> +
> + error:
> +    vzStateCleanup();
> +    return -1;
> +}
> +
> +static virStateDriver vzStateDriver = {
> +    .name = "vz",
> +    .stateInitialize = vzStateInitialize,
> +    .stateCleanup = vzStateCleanup,
> +};
> +
>  /* Parallels domain type backward compatibility*/
>  static virHypervisorDriver parallelsHypervisorDriver;
>  static virConnectDriver parallelsConnectDriver;
> @@ -1594,5 +1698,8 @@ vzRegister(void)
>      if (virRegisterConnectDriver(&vzConnectDriver, false) < 0)
>          return -1;
>  
> +    if (virRegisterStateDriver(&vzStateDriver) < 0)
> +        return -1;
> +
>      return 0;
>  }
> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
> index c006517..9e369ce 100644
> --- a/src/vz/vz_sdk.c
> +++ b/src/vz/vz_sdk.c
> @@ -234,22 +234,22 @@ prlsdkDeinit(void)
>  };
>  
>  int
> -prlsdkConnect(vzConnPtr privconn)
> +prlsdkConnect(vzDriverPtr driver)
>  {
>      PRL_RESULT ret;
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
>  
> -    ret = PrlSrv_Create(&privconn->server);
> +    ret = PrlSrv_Create(&driver->server);
>      if (PRL_FAILED(ret)) {
>          logPrlError(ret);
>          return -1;
>      }
>  
> -    job = PrlSrv_LoginLocalEx(privconn->server, NULL, 0,
> +    job = PrlSrv_LoginLocalEx(driver->server, NULL, 0,
>                                PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE);
>  
>      if (waitJob(job)) {
> -        PrlHandle_Free(privconn->server);
> +        PrlHandle_Free(driver->server);
>          return -1;
>      }
>  
> @@ -257,18 +257,18 @@ prlsdkConnect(vzConnPtr privconn)
>  }
>  
>  void
> -prlsdkDisconnect(vzConnPtr privconn)
> +prlsdkDisconnect(vzDriverPtr driver)
>  {
>      PRL_HANDLE job;
>  
> -    job = PrlSrv_Logoff(privconn->server);
> +    job = PrlSrv_Logoff(driver->server);
>      waitJob(job);
>  
> -    PrlHandle_Free(privconn->server);
> +    PrlHandle_Free(driver->server);
>  }
>  
>  static int
> -prlsdkSdkDomainLookup(vzConnPtr privconn,
> +prlsdkSdkDomainLookup(vzDriverPtr driver,
>                        const char *id,
>                        unsigned int flags,
>                        PRL_HANDLE *sdkdom)
> @@ -278,7 +278,7 @@ prlsdkSdkDomainLookup(vzConnPtr privconn,
>      PRL_RESULT pret = PRL_ERR_UNINITIALIZED;
>      int ret = -1;
>  
> -    job = PrlSrv_GetVmConfig(privconn->server, id, flags);
> +    job = PrlSrv_GetVmConfig(driver->server, id, flags);
>      if (PRL_FAILED(getJobResult(job, &result)))
>          goto cleanup;
>  
> @@ -303,14 +303,14 @@ prlsdkUUIDFormat(const unsigned char *uuid, char *uuidstr)
>  }
>  
>  static PRL_HANDLE
> -prlsdkSdkDomainLookupByUUID(vzConnPtr privconn, const unsigned char *uuid)
> +prlsdkSdkDomainLookupByUUID(vzDriverPtr driver, const unsigned char *uuid)
>  {
>      char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>  
>      prlsdkUUIDFormat(uuid, uuidstr);
>  
> -    if (prlsdkSdkDomainLookup(privconn, uuidstr,
> +    if (prlsdkSdkDomainLookup(driver, uuidstr,
>                                PGVC_SEARCH_BY_UUID, &sdkdom) < 0) {
>          virUUIDFormat(uuid, uuidstr);
>          virReportError(VIR_ERR_NO_DOMAIN,
> @@ -466,7 +466,7 @@ prlsdkAddDomainVideoInfo(PRL_HANDLE sdkdom, virDomainDefPtr def)
>  }
>  
>  static int
> -prlsdkGetDiskInfo(vzConnPtr privconn,
> +prlsdkGetDiskInfo(vzDriverPtr driver,
>                    PRL_HANDLE prldisk,
>                    virDomainDiskDefPtr disk,
>                    bool isCdrom,
> @@ -489,9 +489,9 @@ prlsdkGetDiskInfo(vzConnPtr privconn,
>              virDomainDiskSetFormat(disk, VIR_STORAGE_FILE_RAW);
>          } else {
>              if (isCt)
> -                virDomainDiskSetFormat(disk, privconn->vzCaps.ctDiskFormat);
> +                virDomainDiskSetFormat(disk, driver->vzCaps.ctDiskFormat);
>              else
> -                virDomainDiskSetFormat(disk, privconn->vzCaps.vmDiskFormat);
> +                virDomainDiskSetFormat(disk, driver->vzCaps.vmDiskFormat);
>          }
>      } else {
>          virDomainDiskSetType(disk, VIR_STORAGE_TYPE_BLOCK);
> @@ -620,7 +620,7 @@ prlsdkGetFSInfo(PRL_HANDLE prldisk,
>  }
>  
>  static int
> -prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def)
> +prlsdkAddDomainHardDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def)
>  {
>      PRL_RESULT pret;
>      PRL_UINT32 hddCount;
> @@ -660,7 +660,7 @@ prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDef
>              if (!(disk = virDomainDiskDefNew(NULL)))
>                  goto error;
>  
> -            if (prlsdkGetDiskInfo(privconn, hdd, disk, false, IS_CT(def)) < 0)
> +            if (prlsdkGetDiskInfo(driver, hdd, disk, false, IS_CT(def)) < 0)
>                  goto error;
>  
>              if (virDomainDiskInsert(def, disk) < 0)
> @@ -682,7 +682,7 @@ prlsdkAddDomainHardDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDef
>  }
>  
>  static int
> -prlsdkAddDomainOpticalDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def)
> +prlsdkAddDomainOpticalDisksInfo(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def)
>  {
>      PRL_RESULT pret;
>      PRL_UINT32 cdromsCount;
> @@ -700,7 +700,7 @@ prlsdkAddDomainOpticalDisksInfo(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomain
>          if (!(disk = virDomainDiskDefNew(NULL)))
>              goto error;
>  
> -        if (prlsdkGetDiskInfo(privconn, cdrom, disk, true, IS_CT(def)) < 0)
> +        if (prlsdkGetDiskInfo(driver, cdrom, disk, true, IS_CT(def)) < 0)
>              goto error;
>  
>          PrlHandle_Free(cdrom);
> @@ -963,16 +963,16 @@ prlsdkAddSerialInfo(PRL_HANDLE sdkdom,
>  
>  
>  static int
> -prlsdkAddDomainHardware(vzConnPtr privconn, PRL_HANDLE sdkdom, virDomainDefPtr def)
> +prlsdkAddDomainHardware(vzDriverPtr driver, PRL_HANDLE sdkdom, virDomainDefPtr def)
>  {
>      if (!IS_CT(def))
>          if (prlsdkAddDomainVideoInfo(sdkdom, def) < 0)
>              goto error;
>  
> -    if (prlsdkAddDomainHardDisksInfo(privconn, sdkdom, def) < 0)
> +    if (prlsdkAddDomainHardDisksInfo(driver, sdkdom, def) < 0)
>          goto error;
>  
> -    if (prlsdkAddDomainOpticalDisksInfo(privconn, sdkdom, def) < 0)
> +    if (prlsdkAddDomainOpticalDisksInfo(driver, sdkdom, def) < 0)
>          goto error;
>  
>      if (prlsdkAddDomainNetInfo(sdkdom, def) < 0)
> @@ -1250,7 +1250,7 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr def)
>  }
>  
>  static virDomainObjPtr
> -prlsdkNewDomainByHandle(vzConnPtr privconn, PRL_HANDLE sdkdom)
> +prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom)
>  {
>      virDomainObjPtr dom = NULL;
>      unsigned char uuid[VIR_UUID_BUFLEN];
> @@ -1259,16 +1259,18 @@ prlsdkNewDomainByHandle(vzConnPtr privconn, PRL_HANDLE sdkdom)
>      if (prlsdkGetDomainIds(sdkdom, &name, uuid) < 0)
>          goto cleanup;
>  
> -    if (!(dom = vzNewDomain(privconn, name, uuid)))
> +    virObjectLock(driver);

if you need to introduce lock here i think you need extra patch with explanations

> +    if (!(dom = vzNewDomain(driver, name, uuid)))
>          goto cleanup;
>  
> -    if (prlsdkLoadDomain(privconn, dom) < 0) {
> -        virDomainObjListRemove(privconn->domains, dom);
> +    if (prlsdkLoadDomain(driver, dom) < 0) {
> +        virDomainObjListRemove(driver->domains, dom);
>          dom = NULL;
>          goto cleanup;
>      }
>  
>   cleanup:
> +    virObjectUnlock(driver);
>      VIR_FREE(name);
>      return dom;
>  }
> @@ -1509,7 +1511,7 @@ prlsdkConvertBootOrder(PRL_HANDLE sdkdom, virDomainDefPtr def)
>  }
>  
>  int
> -prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
> +prlsdkLoadDomain(vzDriverPtr driver, virDomainObjPtr dom)
>  {
>      virDomainDefPtr def = NULL;
>      vzDomObjPtr pdom = NULL;
> @@ -1523,11 +1525,10 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
>      PRL_VM_AUTOSTART_OPTION autostart;
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>  
> -    virCheckNonNullArgGoto(privconn, error);
>      virCheckNonNullArgGoto(dom, error);
>  
>      pdom = dom->privateData;
> -    sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid);
> +    sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid);
>      if (sdkdom == PRL_INVALID_HANDLE)
>          return -1;
>  
> @@ -1560,7 +1561,7 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
>      if (prlsdkConvertDomainType(sdkdom, def) < 0)
>          goto error;
>  
> -    if (prlsdkAddDomainHardware(privconn, sdkdom, def) < 0)
> +    if (prlsdkAddDomainHardware(driver, sdkdom, def) < 0)
>          goto error;
>  
>      /* depends on prlsdkAddDomainHardware */
> @@ -1652,7 +1653,7 @@ prlsdkLoadDomain(vzConnPtr privconn, virDomainObjPtr dom)
>  }
>  
>  int
> -prlsdkLoadDomains(vzConnPtr privconn)
> +prlsdkLoadDomains(vzDriverPtr driver)
>  {
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
>      PRL_HANDLE result;
> @@ -1662,7 +1663,7 @@ prlsdkLoadDomains(vzConnPtr privconn)
>      size_t i = 0;
>      virDomainObjPtr dom;
>  
> -    job = PrlSrv_GetVmListEx(privconn->server, PVTF_VM | PVTF_CT);
> +    job = PrlSrv_GetVmListEx(driver->server, PVTF_VM | PVTF_CT);
>  
>      if (PRL_FAILED(getJobResult(job, &result)))
>          return -1;
> @@ -1674,8 +1675,8 @@ prlsdkLoadDomains(vzConnPtr privconn)
>          pret = PrlResult_GetParamByIndex(result, i, &sdkdom);
>          prlsdkCheckRetGoto(pret, error);
>  
> -        if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))
> -            goto error;
> +        if (!(dom = prlsdkNewDomainByHandle(driver, sdkdom)))
> +            continue;
>  
>          virObjectUnlock(dom);
>          PrlHandle_Free(sdkdom);
> @@ -1692,7 +1693,7 @@ prlsdkLoadDomains(vzConnPtr privconn)
>  }
>  
>  int
> -prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom)
> +prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom)
>  {
>      PRL_HANDLE job;
>      vzDomObjPtr pdom = dom->privateData;
> @@ -1701,10 +1702,10 @@ prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom)
>      if (waitJob(job))
>          return -1;
>  
> -    return prlsdkLoadDomain(privconn, dom);
> +    return prlsdkLoadDomain(driver, dom);
>  }
>  
> -static int prlsdkSendEvent(vzConnPtr privconn,
> +static int prlsdkSendEvent(vzDriverPtr driver,
>                             virDomainObjPtr dom,
>                             virDomainEventType lvEventType,
>                             int lvEventTypeDetails)
> @@ -1717,7 +1718,7 @@ static int prlsdkSendEvent(vzConnPtr privconn,
>      if (!event)
>          return -1;
>  
> -    virObjectEventStateQueue(privconn->domainEventState, event);
> +    virObjectEventStateQueue(driver->domainEventState, event);
>      return 0;
>  }
>  
> @@ -1755,7 +1756,7 @@ prlsdkNewStateToEvent(VIRTUAL_MACHINE_STATE domainState,
>  }
>  
>  static void
> -prlsdkHandleVmStateEvent(vzConnPtr privconn,
> +prlsdkHandleVmStateEvent(vzDriverPtr driver,
>                           PRL_HANDLE prlEvent,
>                           unsigned char *uuid)
>  {
> @@ -1767,7 +1768,7 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn,
>      virDomainEventType lvEventType = 0;
>      int lvEventTypeDetails = 0;
>  
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +    dom = virDomainObjListFindByUUID(driver->domains, uuid);
>      if (dom == NULL)
>          return;
>  
> @@ -1785,7 +1786,7 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn,
>                            &lvEventType,
>                            &lvEventTypeDetails);
>  
> -    prlsdkSendEvent(privconn, dom, lvEventType, lvEventTypeDetails);
> +    prlsdkSendEvent(driver, dom, lvEventType, lvEventTypeDetails);
>  
>   cleanup:
>      virObjectUnlock(dom);
> @@ -1793,19 +1794,19 @@ prlsdkHandleVmStateEvent(vzConnPtr privconn,
>  }
>  
>  static void
> -prlsdkHandleVmConfigEvent(vzConnPtr privconn,
> +prlsdkHandleVmConfigEvent(vzDriverPtr driver,
>                            unsigned char *uuid)
>  {
>      virDomainObjPtr dom = NULL;
>  
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +    dom = virDomainObjListFindByUUID(driver->domains, uuid);
>      if (dom == NULL)
>          return;
>  
> -    if (prlsdkUpdateDomain(privconn, dom) < 0)
> +    if (prlsdkUpdateDomain(driver, dom) < 0)
>          goto cleanup;
>  
> -    prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,
> +    prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_DEFINED,
>                      VIR_DOMAIN_EVENT_DEFINED_UPDATED);
>  
>   cleanup:
> @@ -1814,23 +1815,23 @@ prlsdkHandleVmConfigEvent(vzConnPtr privconn,
>  }
>  
>  static void
> -prlsdkHandleVmAddedEvent(vzConnPtr privconn,
> +prlsdkHandleVmAddedEvent(vzDriverPtr driver,
>                           unsigned char *uuid)
>  {
>      virDomainObjPtr dom = NULL;
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>  
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +    dom = virDomainObjListFindByUUID(driver->domains, uuid);
>      if (!dom) {
> -        sdkdom = prlsdkSdkDomainLookupByUUID(privconn, uuid);
> +        sdkdom = prlsdkSdkDomainLookupByUUID(driver, uuid);
>          if (sdkdom == PRL_INVALID_HANDLE)
>              goto cleanup;
>  
> -        if (!(dom = prlsdkNewDomainByHandle(privconn, sdkdom)))
> +        if (!(dom = prlsdkNewDomainByHandle(driver, sdkdom)))
>              goto cleanup;
>      }
>  
> -    prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_DEFINED,
> +    prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_DEFINED,
>                      VIR_DOMAIN_EVENT_DEFINED_ADDED);
>  
>   cleanup:
> @@ -1841,28 +1842,28 @@ prlsdkHandleVmAddedEvent(vzConnPtr privconn,
>  }
>  
>  static void
> -prlsdkHandleVmRemovedEvent(vzConnPtr privconn,
> +prlsdkHandleVmRemovedEvent(vzDriverPtr driver,
>                             unsigned char *uuid)
>  {
>      virDomainObjPtr dom = NULL;
>  
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +    dom = virDomainObjListFindByUUID(driver->domains, uuid);
>      /* domain was removed from the list from the libvirt
>       * API function in current connection */
>      if (dom == NULL)
>          return;
>  
> -    prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_UNDEFINED,
> +    prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED,
>                      VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
>  
> -    virDomainObjListRemove(privconn->domains, dom);
> +    virDomainObjListRemove(driver->domains, dom);
>      return;
>  }
>  
>  #define PARALLELS_STATISTICS_DROP_COUNT 3
>  
>  static PRL_RESULT
> -prlsdkHandlePerfEvent(vzConnPtr privconn,
> +prlsdkHandlePerfEvent(vzDriverPtr driver,
>                        PRL_HANDLE event,
>                        unsigned char *uuid)
>  {
> @@ -1870,7 +1871,7 @@ prlsdkHandlePerfEvent(vzConnPtr privconn,
>      vzDomObjPtr privdom = NULL;
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
>  
> -    dom = virDomainObjListFindByUUID(privconn->domains, uuid);
> +    dom = virDomainObjListFindByUUID(driver->domains, uuid);
>      if (dom == NULL)
>          goto cleanup;
>      privdom = dom->privateData;
> @@ -1907,7 +1908,7 @@ prlsdkHandlePerfEvent(vzConnPtr privconn,
>  static PRL_RESULT
>  prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
>  {
> -    vzConnPtr privconn = opaque;
> +    vzDriverPtr driver = opaque;
>      PRL_RESULT pret = PRL_ERR_FAILURE;
>      PRL_HANDLE_TYPE handleType;
>      char uuidstr[VIR_UUID_STRING_BUFLEN + 2];
> @@ -1922,7 +1923,7 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
>      if (handleType != PHT_EVENT)
>          goto cleanup;
>  
> -    if (privconn == NULL)
> +    if (driver == NULL)
>          goto cleanup;
>  
>      pret = PrlEvent_GetIssuerId(prlEvent, uuidstr, &bufsize);
> @@ -1938,27 +1939,26 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
>  
>      switch (prlEventType) {
>      case PET_DSP_EVT_VM_STATE_CHANGED:
> -        prlsdkHandleVmStateEvent(privconn, prlEvent, uuid);
> +        prlsdkHandleVmStateEvent(driver, prlEvent, uuid);
>          break;
>      case PET_DSP_EVT_VM_CONFIG_CHANGED:
> -        prlsdkHandleVmConfigEvent(privconn, uuid);
> +        prlsdkHandleVmConfigEvent(driver, uuid);
>          break;
>      case PET_DSP_EVT_VM_CREATED:
>      case PET_DSP_EVT_VM_ADDED:
> -        prlsdkHandleVmAddedEvent(privconn, uuid);
> +        prlsdkHandleVmAddedEvent(driver, uuid);
>          break;
>      case PET_DSP_EVT_VM_DELETED:
>      case PET_DSP_EVT_VM_UNREGISTERED:
> -        prlsdkHandleVmRemovedEvent(privconn, uuid);
> +        prlsdkHandleVmRemovedEvent(driver, uuid);
>          break;
>      case PET_DSP_EVT_VM_PERFSTATS:
> -        prlsdkHandlePerfEvent(privconn, prlEvent, uuid);
> +        prlsdkHandlePerfEvent(driver, prlEvent, uuid);
>          /* above function takes own of event */
>          prlEvent = PRL_INVALID_HANDLE;
>          break;
>      case PET_DSP_EVT_DISP_CONNECTION_CLOSED:
> -        virConnectCloseCallbackDataCall(privconn->closeCallback,
> -                                        VIR_CONNECT_CLOSE_REASON_EOF);
> +        vzDestroyDriverConnection();
>          break;
>      default:
>          VIR_DEBUG("Skipping event of type %d", prlEventType);
> @@ -1969,13 +1969,13 @@ prlsdkEventsHandler(PRL_HANDLE prlEvent, PRL_VOID_PTR opaque)
>      return PRL_ERR_SUCCESS;
>  }
>  
> -int prlsdkSubscribeToPCSEvents(vzConnPtr privconn)
> +int prlsdkSubscribeToPCSEvents(vzDriverPtr driver)
>  {
>      PRL_RESULT pret = PRL_ERR_UNINITIALIZED;
>  
> -    pret = PrlSrv_RegEventHandler(privconn->server,
> +    pret = PrlSrv_RegEventHandler(driver->server,
>                                    prlsdkEventsHandler,
> -                                  privconn);
> +                                  driver);
>      prlsdkCheckRetGoto(pret, error);
>      return 0;
>  
> @@ -1983,12 +1983,12 @@ int prlsdkSubscribeToPCSEvents(vzConnPtr privconn)
>      return -1;
>  }
>  
> -void prlsdkUnsubscribeFromPCSEvents(vzConnPtr privconn)
> +void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver)
>  {
>      PRL_RESULT ret = PRL_ERR_UNINITIALIZED;
> -    ret = PrlSrv_UnregEventHandler(privconn->server,
> +    ret = PrlSrv_UnregEventHandler(driver->server,
>                                     prlsdkEventsHandler,
> -                                   privconn);
> +                                   driver);
>      if (PRL_FAILED(ret))
>          logPrlError(ret);
>  }
> @@ -2052,7 +2052,7 @@ PRL_RESULT prlsdkRestart(PRL_HANDLE sdkdom)
>  }
>  
>  int
> -prlsdkDomainChangeStateLocked(vzConnPtr privconn,
> +prlsdkDomainChangeStateLocked(vzDriverPtr driver,
>                                virDomainObjPtr dom,
>                                prlsdkChangeStateFunc chstate)
>  {
> @@ -2078,7 +2078,7 @@ prlsdkDomainChangeStateLocked(vzConnPtr privconn,
>          return -1;
>      }
>  
> -    return prlsdkUpdateDomain(privconn, dom);
> +    return prlsdkUpdateDomain(driver, dom);
>  }
>  
>  int
> @@ -2092,7 +2092,7 @@ prlsdkDomainChangeState(virDomainPtr domain,
>      if (!(dom = vzDomObjFromDomain(domain)))
>          return -1;
>  
> -    ret = prlsdkDomainChangeStateLocked(privconn, dom, chstate);
> +    ret = prlsdkDomainChangeStateLocked(privconn->driver, dom, chstate);
>      virObjectUnlock(dom);
>      return ret;
>  }
> @@ -2850,7 +2850,7 @@ static const char * prlsdkFormatMac(virMacAddrPtr mac, char *macstr)
>      return macstr;
>  }
>  
> -static int prlsdkAddNet(vzConnPtr privconn,
> +static int prlsdkAddNet(vzDriverPtr driver,
>                          PRL_HANDLE sdkdom,
>                          virDomainNetDefPtr net,
>                          bool isCt)
> @@ -3055,7 +3055,7 @@ static int prlsdkAddNet(vzConnPtr privconn,
>          pret = PrlVirtNet_SetNetworkType(vnet, PVN_BRIDGED_ETHERNET);
>          prlsdkCheckRetGoto(pret, cleanup);
>  
> -        job = PrlSrv_AddVirtualNetwork(privconn->server,
> +        job = PrlSrv_AddVirtualNetwork(driver->server,
>                                         vnet,
>                                         PRL_USE_VNET_NAME_FOR_BRIDGE_NAME);
>          if (PRL_FAILED(pret = waitJob(job)))
> @@ -3084,7 +3084,7 @@ static int prlsdkAddNet(vzConnPtr privconn,
>  }
>  
>  static void
> -prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net)
> +prlsdkCleanupBridgedNet(vzDriverPtr driver, virDomainNetDefPtr net)
>  {
>      PRL_RESULT pret;
>      PRL_HANDLE vnet = PRL_INVALID_HANDLE;
> @@ -3099,7 +3099,7 @@ prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net)
>      pret = PrlVirtNet_SetNetworkId(vnet, net->data.network.name);
>      prlsdkCheckRetGoto(pret, cleanup);
>  
> -    job = PrlSrv_DeleteVirtualNetwork(privconn->server, vnet, 0);
> +    job = PrlSrv_DeleteVirtualNetwork(driver->server, vnet, 0);
>      if (PRL_FAILED(pret = waitJob(job)))
>          goto cleanup;
>  
> @@ -3107,7 +3107,7 @@ prlsdkCleanupBridgedNet(vzConnPtr privconn, virDomainNetDefPtr net)
>      PrlHandle_Free(vnet);
>  }
>  
> -int prlsdkAttachNet(vzConnPtr privconn,
> +int prlsdkAttachNet(vzDriverPtr driver,
>                      virDomainObjPtr dom,
>                      virDomainNetDefPtr net)
>  {
> @@ -3125,7 +3125,7 @@ int prlsdkAttachNet(vzConnPtr privconn,
>      if (PRL_FAILED(waitJob(job)))
>          return ret;
>  
> -    ret = prlsdkAddNet(privconn, privdom->sdkdom, net, IS_CT(dom->def));
> +    ret = prlsdkAddNet(driver, privdom->sdkdom, net, IS_CT(dom->def));
>      if (ret == 0) {
>          job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
>          if (PRL_FAILED(waitJob(job)))
> @@ -3172,7 +3172,7 @@ prlsdkFindNetByMAC(PRL_HANDLE sdkdom, virMacAddrPtr mac)
>      return adapter;
>  }
>  
> -int prlsdkDetachNet(vzConnPtr privconn,
> +int prlsdkDetachNet(vzDriverPtr driver,
>                      virDomainObjPtr dom,
>                      virDomainNetDefPtr net)
>  {
> @@ -3196,7 +3196,7 @@ int prlsdkDetachNet(vzConnPtr privconn,
>      if (sdknet == PRL_INVALID_HANDLE)
>          goto cleanup;
>  
> -    prlsdkCleanupBridgedNet(privconn, net);
> +    prlsdkCleanupBridgedNet(driver, net);
>  
>      pret = PrlVmDev_Remove(sdknet);
>      prlsdkCheckRetGoto(pret, cleanup);
> @@ -3231,7 +3231,7 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
>      return ret;
>  }
>  
> -static int prlsdkAddDisk(vzConnPtr privconn,
> +static int prlsdkAddDisk(vzDriverPtr driver,
>                           PRL_HANDLE sdkdom,
>                           virDomainDiskDefPtr disk)
>  {
> @@ -3342,7 +3342,7 @@ static int prlsdkAddDisk(vzConnPtr privconn,
>      }
>  
>      if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
> -        if (vzGetDefaultSCSIModel(privconn, &scsiModel) < 0)
> +        if (vzGetDefaultSCSIModel(driver, &scsiModel) < 0)
>              goto cleanup;
>          pret = PrlVmDev_SetSubType(sdkdisk, scsiModel);
>          prlsdkCheckRetGoto(pret, cleanup);
> @@ -3380,7 +3380,7 @@ static int prlsdkAddDisk(vzConnPtr privconn,
>  }
>  
>  int
> -prlsdkAttachVolume(vzConnPtr privconn,
> +prlsdkAttachVolume(vzDriverPtr driver,
>                     virDomainObjPtr dom,
>                     virDomainDiskDefPtr disk)
>  {
> @@ -3392,7 +3392,7 @@ prlsdkAttachVolume(vzConnPtr privconn,
>      if (PRL_FAILED(waitJob(job)))
>          goto cleanup;
>  
> -    ret = prlsdkAddDisk(privconn, privdom->sdkdom, disk);
> +    ret = prlsdkAddDisk(driver, privdom->sdkdom, disk);
>      if (ret == 0) {
>          job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
>          if (PRL_FAILED(waitJob(job))) {
> @@ -3594,7 +3594,7 @@ prlsdkSetBootOrderVm(PRL_HANDLE sdkdom, virDomainDefPtr def)
>  }
>  
>  static int
> -prlsdkDoApplyConfig(virConnectPtr conn,
> +prlsdkDoApplyConfig(vzDriverPtr driver,
>                      PRL_HANDLE sdkdom,
>                      virDomainDefPtr def,
>                      virDomainDefPtr olddef)
> @@ -3660,11 +3660,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>  
>      if (olddef) {
>          for (i = 0; i < olddef->nnets; i++)
> -            prlsdkCleanupBridgedNet(conn->privateData, olddef->nets[i]);
> +            prlsdkCleanupBridgedNet(driver, olddef->nets[i]);
>      }
>  
>      for (i = 0; i < def->nnets; i++) {
> -        if (prlsdkAddNet(conn->privateData, sdkdom, def->nets[i], IS_CT(def)) < 0)
> +        if (prlsdkAddNet(driver, sdkdom, def->nets[i], IS_CT(def)) < 0)
>              goto error;
>      }
>  
> @@ -3685,7 +3685,7 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>      }
>  
>      for (i = 0; i < def->ndisks; i++) {
> -        if (prlsdkAddDisk(conn->privateData, sdkdom, def->disks[i]) < 0)
> +        if (prlsdkAddDisk(driver, sdkdom, def->disks[i]) < 0)
>              goto error;
>      }
>  
> @@ -3703,22 +3703,21 @@ prlsdkDoApplyConfig(virConnectPtr conn,
>      VIR_FREE(mask);
>  
>      for (i = 0; i < def->nnets; i++)
> -        prlsdkCleanupBridgedNet(conn->privateData, def->nets[i]);
> +        prlsdkCleanupBridgedNet(driver, def->nets[i]);
>  
>      return -1;
>  }
>  
>  int
> -prlsdkApplyConfig(virConnectPtr conn,
> +prlsdkApplyConfig(vzDriverPtr driver,
>                    virDomainObjPtr dom,
>                    virDomainDefPtr new)
>  {
> -    vzConnPtr privconn = conn->privateData;
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
>      int ret;
>  
> -    sdkdom = prlsdkSdkDomainLookupByUUID(privconn, dom->def->uuid);
> +    sdkdom = prlsdkSdkDomainLookupByUUID(driver, dom->def->uuid);
>      if (sdkdom == PRL_INVALID_HANDLE)
>          return -1;
>  
> @@ -3726,7 +3725,7 @@ prlsdkApplyConfig(virConnectPtr conn,
>      if (PRL_FAILED(waitJob(job)))
>          return -1;
>  
> -    ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);
> +    ret = prlsdkDoApplyConfig(driver, sdkdom, new, dom->def);
>  
>      if (ret == 0) {
>          job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
> @@ -3740,9 +3739,8 @@ prlsdkApplyConfig(virConnectPtr conn,
>  }
>  
>  int
> -prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
> +prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def)
>  {
> -    vzConnPtr privconn = conn->privateData;
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
>      PRL_HANDLE result = PRL_INVALID_HANDLE;
> @@ -3750,10 +3748,10 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
>      PRL_RESULT pret;
>      int ret = -1;
>  
> -    pret = PrlSrv_CreateVm(privconn->server, &sdkdom);
> +    pret = PrlSrv_CreateVm(driver->server, &sdkdom);
>      prlsdkCheckRetGoto(pret, cleanup);
>  
> -    job = PrlSrv_GetSrvConfig(privconn->server);
> +    job = PrlSrv_GetSrvConfig(driver->server);
>      if (PRL_FAILED(getJobResult(job, &result)))
>          goto cleanup;
>  
> @@ -3766,7 +3764,7 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
>      pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0);
>      prlsdkCheckRetGoto(pret, cleanup);
>  
> -    ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
> +    ret = prlsdkDoApplyConfig(driver, sdkdom, def, NULL);
>      if (ret)
>          goto cleanup;
>  
> @@ -3780,9 +3778,8 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
>  }
>  
>  int
> -prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
> +prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def)
>  {
> -    vzConnPtr privconn = conn->privateData;
>      PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
>      PRL_GET_VM_CONFIG_PARAM_DATA confParam;
>      PRL_HANDLE job = PRL_INVALID_HANDLE;
> @@ -3815,7 +3812,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
>      confParam.sConfigSample = "vswap.1024MB";
>      confParam.nOsVersion = 0;
>  
> -    job = PrlSrv_GetDefaultVmConfig(privconn->server, &confParam, 0);
> +    job = PrlSrv_GetDefaultVmConfig(driver->server, &confParam, 0);
>      if (PRL_FAILED(getJobResult(job, &result)))
>          goto cleanup;
>  
> @@ -3828,7 +3825,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
>  
>      }
>  
> -    ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
> +    ret = prlsdkDoApplyConfig(driver, sdkdom, def, NULL);
>      if (ret)
>          goto cleanup;
>  
> @@ -3947,7 +3944,7 @@ prlsdkDomainHasSnapshots(PRL_HANDLE sdkdom, int* found)
>  }
>  
>  int
> -prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags)
> +prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int flags)
>  {
>      vzDomObjPtr privdom = dom->privateData;
>      PRL_HANDLE job;
> @@ -3984,13 +3981,13 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int fla
>          return -1;
>  
>      for (i = 0; i < dom->def->nnets; i++)
> -        prlsdkCleanupBridgedNet(privconn, dom->def->nets[i]);
> +        prlsdkCleanupBridgedNet(driver, dom->def->nets[i]);
>  
> -    if (prlsdkSendEvent(privconn, dom, VIR_DOMAIN_EVENT_UNDEFINED,
> +    if (prlsdkSendEvent(driver, dom, VIR_DOMAIN_EVENT_UNDEFINED,
>                          VIR_DOMAIN_EVENT_UNDEFINED_REMOVED) < 0)
>          return -1;
>  
> -    virDomainObjListRemove(privconn->domains, dom);
> +    virDomainObjListRemove(driver->domains, dom);
>      return 0;
>  }
>  
> diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h
> index 2f11d4f..f197832 100644
> --- a/src/vz/vz_sdk.h
> +++ b/src/vz/vz_sdk.h
> @@ -26,16 +26,16 @@
>  
>  int prlsdkInit(void);
>  void prlsdkDeinit(void);
> -int prlsdkConnect(vzConnPtr privconn);
> -void prlsdkDisconnect(vzConnPtr privconn);
> +int prlsdkConnect(vzDriverPtr driver);
> +void prlsdkDisconnect(vzDriverPtr driver);
>  int
> -prlsdkLoadDomains(vzConnPtr privconn);
> -int prlsdkUpdateDomain(vzConnPtr privconn, virDomainObjPtr dom);
> +prlsdkLoadDomains(vzDriverPtr driver);
> +int prlsdkUpdateDomain(vzDriverPtr driver, virDomainObjPtr dom);
>  int
> -prlsdkLoadDomain(vzConnPtr privconn,
> +prlsdkLoadDomain(vzDriverPtr driver,
>                   virDomainObjPtr dom);
> -int prlsdkSubscribeToPCSEvents(vzConnPtr privconn);
> -void prlsdkUnsubscribeFromPCSEvents(vzConnPtr privconn);
> +int prlsdkSubscribeToPCSEvents(vzDriverPtr driver);
> +void prlsdkUnsubscribeFromPCSEvents(vzDriverPtr driver);
>  PRL_RESULT prlsdkStart(PRL_HANDLE sdkdom);
>  PRL_RESULT prlsdkKill(PRL_HANDLE sdkdom);
>  PRL_RESULT prlsdkStop(PRL_HANDLE sdkdom);
> @@ -49,29 +49,29 @@ int
>  prlsdkDomainChangeState(virDomainPtr domain,
>                          prlsdkChangeStateFunc chstate);
>  int
> -prlsdkDomainChangeStateLocked(vzConnPtr privconn,
> +prlsdkDomainChangeStateLocked(vzDriverPtr driver,
>                                virDomainObjPtr dom,
>                                prlsdkChangeStateFunc chstate);
>  int
> -prlsdkApplyConfig(virConnectPtr conn,
> +prlsdkApplyConfig(vzDriverPtr driver,
>                    virDomainObjPtr dom,
>                    virDomainDefPtr new);
> -int prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def);
> -int prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def);
> +int prlsdkCreateVm(vzDriverPtr driver, virDomainDefPtr def);
> +int prlsdkCreateCt(vzDriverPtr driver, virDomainDefPtr def);
>  int
> -prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int flags);
> +prlsdkUnregisterDomain(vzDriverPtr driver, virDomainObjPtr dom, unsigned int flags);
>  int
>  prlsdkDomainManagedSaveRemove(virDomainObjPtr dom);
>  int
> -prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk);
> +prlsdkAttachVolume(vzDriverPtr driver, virDomainObjPtr dom, virDomainDiskDefPtr disk);
>  int
>  prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
>  int
>  prlsdkGetBlockStats(virDomainObjPtr dom, virDomainDiskDefPtr disk, virDomainBlockStatsPtr stats);
>  int
> -prlsdkAttachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr net);
> +prlsdkAttachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net);
>  int
> -prlsdkDetachNet(vzConnPtr privconn, virDomainObjPtr dom, virDomainNetDefPtr net);
> +prlsdkDetachNet(vzDriverPtr driver, virDomainObjPtr dom, virDomainNetDefPtr net);
>  int
>  prlsdkGetNetStats(virDomainObjPtr dom, const char *path, virDomainInterfaceStatsPtr stats);
>  int
> diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c
> index 64e469c..6e28f20 100644
> --- a/src/vz/vz_utils.c
> +++ b/src/vz/vz_utils.c
> @@ -73,8 +73,9 @@ vzDomObjFromDomain(virDomainPtr domain)
>      virDomainObjPtr vm;
>      vzConnPtr privconn = domain->conn->privateData;
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
> +    vzDriverPtr driver = privconn->driver;
>  
> -    vm = virDomainObjListFindByUUID(privconn->domains, domain->uuid);
> +    vm = virDomainObjListFindByUUID(driver->domains, domain->uuid);
>      if (!vm) {
>          virUUIDFormat(domain->uuid, uuidstr);
>          virReportError(VIR_ERR_NO_DOMAIN,
> @@ -84,7 +85,6 @@ vzDomObjFromDomain(virDomainPtr domain)
>      }
>  
>      return vm;
> -
>  }
>  
>  /**
> @@ -103,8 +103,9 @@ vzDomObjFromDomainRef(virDomainPtr domain)
>      virDomainObjPtr vm;
>      vzConnPtr privconn = domain->conn->privateData;
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
> +    vzDriverPtr driver = privconn->driver;
>  
> -    vm = virDomainObjListFindByUUIDRef(privconn->domains, domain->uuid);
> +    vm = virDomainObjListFindByUUIDRef(driver->domains, domain->uuid);
>      if (!vm) {
>          virUUIDFormat(domain->uuid, uuidstr);
>          virReportError(VIR_ERR_NO_DOMAIN,
> @@ -159,7 +160,7 @@ vzGetOutput(const char *binary, ...)
>  }
>  
>  virDomainObjPtr
> -vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)
> +vzNewDomain(vzDriverPtr driver, char *name, const unsigned char *uuid)
>  {
>      virDomainDefPtr def = NULL;
>      virDomainObjPtr dom = NULL;
> @@ -180,8 +181,8 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)
>  
>      def->virtType = VIR_DOMAIN_VIRT_VZ;
>  
> -    if (!(dom = virDomainObjListAdd(privconn->domains, def,
> -                                    privconn->xmlopt,
> +    if (!(dom = virDomainObjListAdd(driver->domains, def,
> +                                    driver->xmlopt,
>                                      0, NULL)))
>          goto error;
>  
> @@ -199,7 +200,7 @@ vzNewDomain(vzConnPtr privconn, char *name, const unsigned char *uuid)
>  }
>  
>  static void
> -vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps)
> +vzInitCaps(unsigned long vzVersion, vzCapabilitiesPtr vzCaps)
>  {
>      if (vzVersion < VIRTUOZZO_VER_7) {
>          vzCaps->ctDiskFormat = VIR_STORAGE_FILE_PLOOP;
> @@ -217,7 +218,7 @@ vzInitCaps(unsigned long vzVersion, vzCapabilities *vzCaps)
>  }
>  
>  int
> -vzInitVersion(vzConnPtr privconn)
> +vzInitVersion(vzDriverPtr driver)
>  {
>      char *output, *sVer, *tmp;
>      const char *searchStr = "prlsrvctl version ";
> @@ -250,12 +251,12 @@ vzInitVersion(vzConnPtr privconn)
>      }
>  
>      tmp[0] = '\0';
> -    if (virParseVersionString(sVer, &(privconn->vzVersion), true) < 0) {
> +    if (virParseVersionString(sVer, &(driver->vzVersion), true) < 0) {
>          vzParseError();
>          goto cleanup;
>      }
>  
> -    vzInitCaps(privconn->vzVersion, &privconn->vzCaps);
> +    vzInitCaps(driver->vzVersion, &driver->vzCaps);
>      ret = 0;
>  
>   cleanup:
> @@ -473,10 +474,10 @@ vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps)
>      return 0;
>  }
>  
> -int vzGetDefaultSCSIModel(vzConnPtr privconn,
> +int vzGetDefaultSCSIModel(vzDriverPtr driver,
>                            PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel)
>  {
> -    switch (privconn->vzCaps.scsiControllerModel) {
> +    switch (driver->vzCaps.scsiControllerModel) {
>      case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI:
>          *scsiModel = PCD_VIRTIO_SCSI;
>          break;
> @@ -487,7 +488,7 @@ int vzGetDefaultSCSIModel(vzConnPtr privconn,
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("Unknown SCSI controller model %s"),
>                         virDomainControllerModelSCSITypeToString(
> -                           privconn->vzCaps.scsiControllerModel));
> +                           driver->vzCaps.scsiControllerModel));
>          return -1;
>      }
>      return 0;
> diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h
> index b415b0f..ce2fd92 100644
> --- a/src/vz/vz_utils.h
> +++ b/src/vz/vz_utils.h
> @@ -60,8 +60,8 @@ struct _vzCapabilities {
>  typedef struct _vzCapabilities vzCapabilities;
>  typedef struct _vzCapabilities *vzCapabilitiesPtr;
>  
> -struct _vzConn {
> -    virMutex lock;
> +struct _vzDriver {
> +    virObjectLockable parent;
>  
>      /* Immutable pointer, self-locking APIs */
>      virDomainObjListPtr domains;
> @@ -76,9 +76,21 @@ struct _vzConn {
>      vzCapabilities vzCaps;
>  };

you need to remove virConnectCloseCallbackDataPtr field from driver

>  
> +typedef struct _vzDriver vzDriver;
> +typedef struct _vzDriver *vzDriverPtr;
> +
> +struct _vzConn {
> +    struct _vzConn* next;
> +
> +    vzDriverPtr driver;
> +    /* Immutable pointer, self-locking APIs */
> +    virConnectCloseCallbackDataPtr closeCallback;
> +};
> +
>  typedef struct _vzConn vzConn;
>  typedef struct _vzConn *vzConnPtr;
>  
> +
>  struct _vzCountersCache {
>      PRL_HANDLE stats;
>      virCond cond;
> @@ -105,12 +117,19 @@ char * vzGetOutput(const char *binary, ...)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
>  void vzDriverLock(vzConnPtr driver);
>  void vzDriverUnlock(vzConnPtr driver);
> +
> +vzDriverPtr
> +vzGetDriverConnection(void);
> +
> +void
> +vzDestroyDriverConnection(void);
> +
>  virDomainObjPtr
> -vzNewDomain(vzConnPtr privconn,
> +vzNewDomain(vzDriverPtr driver,
>              char *name,
>              const unsigned char *uuid);
>  int
> -vzInitVersion(vzConnPtr privconn);
> +vzInitVersion(vzDriverPtr driver);
>  int
>  vzCheckUnsupportedDisks(virDomainDefPtr def,
>                          vzCapabilitiesPtr vzCaps);
> @@ -118,7 +137,7 @@ int
>  vzCheckUnsupportedControllers(virDomainDefPtr def,
>                                vzCapabilitiesPtr vzCaps);
>  int
> -vzGetDefaultSCSIModel(vzConnPtr privconn,
> +vzGetDefaultSCSIModel(vzDriverPtr driver,
>                        PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel);
>  
>  # define PARALLELS_BLOCK_STATS_FOREACH(OP)                              \
> 




More information about the libvir-list mailing list