#include "driver.h"
#include "storage_driver.h"
#include "storage_conf.h"
+#include "storage_event.h"
#include "viralloc.h"
#include "storage_backend.h"
#include "virlog.h"
storagePoolUpdateAllState();
+ driver->storageEventState = virObjectEventStateNew();
+
storageDriverUnlock();
ret = 0;
storageDriverLock();
+ virObjectEventStateFree(driver->storageEventState);
+
/* free inactive pools */
virStoragePoolObjListFree(&driver->pools);
virStoragePoolObjPtr pool = NULL;
virStoragePoolPtr ret = NULL;
virStorageBackendPtr backend;
+ virObjectEventPtr event = NULL;
char *stateFile = NULL;
unsigned int build_flags = 0;
pool = NULL;
goto cleanup;
}
+
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_STARTED,
+ 0);
+
VIR_INFO("Creating storage pool '%s'", pool->def->name);
pool->active = true;
cleanup:
VIR_FREE(stateFile);
virStoragePoolDefFree(def);
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
storageDriverUnlock();
virStoragePoolDefPtr def;
virStoragePoolObjPtr pool = NULL;
virStoragePoolPtr ret = NULL;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, NULL);
pool = NULL;
goto cleanup;
}
+
+ event = virStoragePoolEventLifecycleNew(def->name, def->uuid,
+ VIR_STORAGE_POOL_EVENT_DEFINED,
+ 0);
+
def = NULL;
VIR_INFO("Defining storage pool '%s'", pool->def->name);
NULL, NULL);
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
virStoragePoolDefFree(def);
if (pool)
virStoragePoolObjUnlock(pool);
storagePoolUndefine(virStoragePoolPtr obj)
{
virStoragePoolObjPtr pool;
+ virObjectEventPtr event = NULL;
int ret = -1;
storageDriverLock();
VIR_FREE(pool->configFile);
VIR_FREE(pool->autostartLink);
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_UNDEFINED,
+ 0);
+
VIR_INFO("Undefining storage pool '%s'", pool->def->name);
virStoragePoolObjRemove(&driver->pools, pool);
pool = NULL;
ret = 0;
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
storageDriverUnlock();
{
virStoragePoolObjPtr pool;
virStorageBackendPtr backend;
+ virObjectEventPtr event = NULL;
int ret = -1;
char *stateFile = NULL;
unsigned int build_flags = 0;
goto cleanup;
}
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_STARTED,
+ 0);
+
pool->active = true;
ret = 0;
cleanup:
VIR_FREE(stateFile);
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
return ret;
{
virStoragePoolObjPtr pool;
virStorageBackendPtr backend;
+ virObjectEventPtr event = NULL;
char *stateFile = NULL;
int ret = -1;
virStoragePoolObjClearVols(pool);
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_STOPPED,
+ 0);
+
pool->active = false;
if (pool->configFile == NULL) {
ret = 0;
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
storageDriverUnlock();
virStoragePoolObjPtr pool;
virStorageBackendPtr backend;
int ret = -1;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, -1);
if (backend->stopPool)
backend->stopPool(obj->conn, pool);
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_STOPPED,
+ 0);
pool->active = false;
if (pool->configFile == NULL) {
}
goto cleanup;
}
+
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_REFRESHED,
+ 0);
ret = 0;
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
storageDriverUnlock();
virStorageVolStreamInfoPtr cbdata = opaque;
virStoragePoolObjPtr pool = NULL;
virStorageBackendPtr backend;
+ virObjectEventPtr event = NULL;
storageDriverLock();
if (cbdata->vol_path) {
if (backend->refreshPool(NULL, pool) < 0)
VIR_DEBUG("Failed to refresh storage pool");
+ event = virStoragePoolEventLifecycleNew(pool->def->name,
+ pool->def->uuid,
+ VIR_STORAGE_POOL_EVENT_REFRESHED,
+ 0);
+
cleanup:
+ if (event)
+ virObjectEventStateQueue(driver->storageEventState, event);
if (pool)
virStoragePoolObjUnlock(pool);
storageDriverUnlock();
return ret;
}
+static int
+storageConnectStoragePoolEventRegisterAny(virConnectPtr conn,
+ virStoragePoolPtr pool,
+ int eventID,
+ virConnectStoragePoolEventGenericCallback callback,
+ void *opaque,
+ virFreeCallback freecb)
+{
+ int callbackID = -1;
+
+ if (virConnectStoragePoolEventRegisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virStoragePoolEventStateRegisterID(conn, driver->storageEventState,
+ pool, eventID, callback,
+ opaque, freecb, &callbackID) < 0)
+ callbackID = -1;
+ cleanup:
+ return callbackID;
+}
+
+static int
+storageConnectStoragePoolEventDeregisterAny(virConnectPtr conn,
+ int callbackID)
+{
+ int ret = -1;
+
+ if (virConnectStoragePoolEventDeregisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virObjectEventStateDeregisterID(conn,
+ driver->storageEventState,
+ callbackID) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
static virStorageDriver storageDriver = {
.name = "storage",
.connectNumOfDefinedStoragePools = storageConnectNumOfDefinedStoragePools, /* 0.4.0 */
.connectListDefinedStoragePools = storageConnectListDefinedStoragePools, /* 0.4.0 */
.connectListAllStoragePools = storageConnectListAllStoragePools, /* 0.10.2 */
+ .connectStoragePoolEventRegisterAny = storageConnectStoragePoolEventRegisterAny, /* 2.0.0 */
+ .connectStoragePoolEventDeregisterAny = storageConnectStoragePoolEventDeregisterAny, /* 2.0.0 */
.connectFindStoragePoolSources = storageConnectFindStoragePoolSources, /* 0.4.0 */
.storagePoolLookupByName = storagePoolLookupByName, /* 0.4.0 */
.storagePoolLookupByUUID = storagePoolLookupByUUID, /* 0.4.0 */