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

Maxim Nestratov mnestratov at virtuozzo.com
Tue Apr 12 18:12:16 UTC 2016


12.04.2016 14:11, Nikolay Shirokovskiy пишет:
>
> 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

fixed

>
>>   
>>   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

agree

>> +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.

not sure about moving
as for a new version of close callback - certainly not in this patch series

>> +
>> +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

agree

>
>> +
>> +    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

ahh, sure

>> +        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,

not sure, but if you insist...

> and since this func is pretty simple i suggest open code it in that new function

didn't get you, sorry

>
>> +
>> +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

sure, just forgot to change it since last version

>
>>   
>> -    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

or just ignored since I intentionally did this but forgot to put it in 
ignore_value()

>> +    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

ok, seems to be shorter...

>> +
>> +    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

ok, makes sense

>
>> +    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

ok

>>   {
>>       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

ok

>
>>       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

indeed

>> +    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?

just not to prevent daemon from starting

>
>> +
>> +    if (prlsdkInit() < 0) {
>> +        VIR_DEBUG("%s", _("Can't initialize Parallels SDK"));
> look like you need to report error here

I just followed the rule other state drivers stick to

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

the same

>
>> +        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

ok

>> +    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

ok

>
>> +    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

ok

>>   
>> +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