[libvirt] [PATCH v3] storage: Add support for storage pool state XML
Erik Skultety
eskultet at redhat.com
Tue Apr 7 14:28:20 UTC 2015
Thanks, fixed and pushed with remaining ACKed patches 5 and 6.
Erik
On 04/07/2015 03:55 PM, John Ferlan wrote:
>
>
> On 04/03/2015 07:03 AM, Erik Skultety wrote:
>> This patch introduces new virStorageDriverState element stateDir.
>> Also adds necessary changes to storageStateInitialize, so that
>> directories initialization becomes more generic.
>> ---
>> src/conf/storage_conf.h | 1 +
>> src/storage/storage_driver.c | 108 +++++++++++++++++++++++++++++++------------
>> 2 files changed, 79 insertions(+), 30 deletions(-)
>>
>> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
>> index da378b7..8d43019 100644
>> --- a/src/conf/storage_conf.h
>> +++ b/src/conf/storage_conf.h
>> @@ -293,6 +293,7 @@ struct _virStorageDriverState {
>>
>> char *configDir;
>> char *autostartDir;
>> + char *stateDir;
>> bool privileged;
>> };
>>
>> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
>> index 64ea770..b350ee6 100644
>> --- a/src/storage/storage_driver.c
>> +++ b/src/storage/storage_driver.c
>> @@ -78,6 +78,7 @@ static void
>> storageDriverAutostart(void)
>> {
>> size_t i;
>> + char *stateFile = NULL;
>> virConnectPtr conn = NULL;
>>
>> /* XXX Remove hardcoding of QEMU URI */
>> @@ -126,7 +127,11 @@ storageDriverAutostart(void)
>>
>> if (started) {
>> virStoragePoolObjClearVols(pool);
>> - if (backend->refreshPool(conn, pool) < 0) {
>> + stateFile = virFileBuildPath(driver->stateDir,
>> + pool->def->name, ".xml");
>> + if (!stateFile ||
>> + virStoragePoolSaveState(stateFile, pool->def) < 0 ||
>> + backend->refreshPool(conn, pool) < 0) {
>> virErrorPtr err = virGetLastError();
>> if (backend->stopPool)
>> backend->stopPool(conn, pool);
>> @@ -136,7 +141,9 @@ storageDriverAutostart(void)
>> virStoragePoolObjUnlock(pool);
>
> Add a VIR_FREE(stateFile); before continue
>
>> continue;
>> }
>> +
>> pool->active = 1;
>> + VIR_FREE(stateFile);
>> }
>> virStoragePoolObjUnlock(pool);
>> }
>> @@ -147,61 +154,67 @@ storageDriverAutostart(void)
>> /**
>> * virStorageStartup:
>> *
>> - * Initialization function for the QEmu daemon
>> + * Initialization function for the Storage Driver
>> */
>> static int
>> storageStateInitialize(bool privileged,
>> virStateInhibitCallback callback ATTRIBUTE_UNUSED,
>> void *opaque ATTRIBUTE_UNUSED)
>> {
>> - char *base = NULL;
>> + int ret = -1;
>> + char *configdir = NULL;
>> + char *rundir = NULL;
>>
>> if (VIR_ALLOC(driver) < 0)
>> - return -1;
>> + return ret;
>>
>> if (virMutexInit(&driver->lock) < 0) {
>> VIR_FREE(driver);
>> - return -1;
>> + return ret;
>> }
>> storageDriverLock();
>>
>> if (privileged) {
>> - if (VIR_STRDUP(base, SYSCONFDIR "/libvirt") < 0)
>> + if (VIR_STRDUP(driver->configDir,
>> + SYSCONFDIR "/libvirt/storage") < 0 ||
>> + VIR_STRDUP(driver->autostartDir,
>> + SYSCONFDIR "/libvirt/storage/autostart") < 0 ||
>> + VIR_STRDUP(driver->stateDir,
>> + LOCALSTATEDIR "/run/libvirt/storage") < 0)
>> goto error;
>> } else {
>> - base = virGetUserConfigDirectory();
>> - if (!base)
>> + configdir = virGetUserConfigDirectory();
>> + rundir = virGetUserRuntimeDirectory();
>> + if (!(configdir && rundir))
>> + goto error;
>> +
>> + if ((virAsprintf(&driver->configDir,
>> + "%s/storage", configdir) < 0) ||
>> + (virAsprintf(&driver->autostartDir,
>> + "%s/storage", configdir) < 0) ||
>> + (virAsprintf(&driver->stateDir,
>> + "%s/storage/run", rundir) < 0))
>> goto error;
>> }
>> driver->privileged = privileged;
>>
>> - /*
>> - * Configuration paths are either $USER_CONFIG_HOME/libvirt/storage/...
>> - * (session) or /etc/libvirt/storage/... (system).
>> - */
>> - if (virAsprintf(&driver->configDir,
>> - "%s/storage", base) == -1)
>> - goto error;
>> -
>> - if (virAsprintf(&driver->autostartDir,
>> - "%s/storage/autostart", base) == -1)
>> - goto error;
>> -
>> - VIR_FREE(base);
>> -
>> if (virStoragePoolLoadAllConfigs(&driver->pools,
>> driver->configDir,
>> driver->autostartDir) < 0)
>> goto error;
>>
>> storageDriverUnlock();
>> - return 0;
>> +
>> + ret = 0;
>> + cleanup:
>> + VIR_FREE(configdir);
>> + VIR_FREE(rundir);
>> + return ret;
>>
>> error:
>> - VIR_FREE(base);
>> storageDriverUnlock();
>> storageStateCleanup();
>> - return -1;
>> + goto cleanup;
>> }
>>
>> /**
>> @@ -261,6 +274,7 @@ storageStateCleanup(void)
>>
>> VIR_FREE(driver->configDir);
>> VIR_FREE(driver->autostartDir);
>> + VIR_FREE(driver->stateDir);
>> storageDriverUnlock();
>> virMutexDestroy(&driver->lock);
>> VIR_FREE(driver);
>> @@ -579,6 +593,7 @@ storagePoolCreateXML(virConnectPtr conn,
>> virStoragePoolObjPtr pool = NULL;
>> virStoragePoolPtr ret = NULL;
>> virStorageBackendPtr backend;
>> + char *stateFile;
>
> s/;/ = NULL;
>
>>
>> virCheckFlags(0, NULL);
>>
>> @@ -609,7 +624,11 @@ storagePoolCreateXML(virConnectPtr conn,
>> goto cleanup;
>> }
>>
>> - if (backend->refreshPool(conn, pool) < 0) {
>> + stateFile = virFileBuildPath(driver->stateDir,
>> + pool->def->name, ".xml");
>> +
>> + if (!stateFile || virStoragePoolSaveState(stateFile, pool->def) < 0 ||
>> + backend->refreshPool(conn, pool) < 0) {
>> if (backend->stopPool)
>> backend->stopPool(conn, pool);
>> virStoragePoolObjRemove(&driver->pools, pool);
>
>
> Then in the cleanup:
>
> VIR_FREE(stateFile);
>
> ACK - with the adjustments
>
>
> John
>
>> @@ -745,6 +764,7 @@ storagePoolCreate(virStoragePoolPtr obj,
>> virStoragePoolObjPtr pool;
>> virStorageBackendPtr backend;
>> int ret = -1;
>> + char *stateFile = NULL;
>>
>> virCheckFlags(0, -1);
>>
>> @@ -763,21 +783,27 @@ storagePoolCreate(virStoragePoolPtr obj,
>> pool->def->name);
>> goto cleanup;
>> }
>> +
>> + VIR_INFO("Starting up storage pool '%s'", pool->def->name);
>> if (backend->startPool &&
>> backend->startPool(obj->conn, pool) < 0)
>> goto cleanup;
>>
>> - if (backend->refreshPool(obj->conn, pool) < 0) {
>> + stateFile = virFileBuildPath(driver->stateDir,
>> + pool->def->name, ".xml");
>> +
>> + if (!stateFile || virStoragePoolSaveState(stateFile, pool->def) < 0 ||
>> + backend->refreshPool(obj->conn, pool) < 0) {
>> if (backend->stopPool)
>> backend->stopPool(obj->conn, pool);
>> goto cleanup;
>> }
>>
>> - VIR_INFO("Starting up storage pool '%s'", pool->def->name);
>> pool->active = 1;
>> ret = 0;
>>
>> cleanup:
>> + VIR_FREE(stateFile);
>> virStoragePoolObjUnlock(pool);
>> return ret;
>> }
>> @@ -822,6 +848,7 @@ storagePoolDestroy(virStoragePoolPtr obj)
>> {
>> virStoragePoolObjPtr pool;
>> virStorageBackendPtr backend;
>> + char *stateFile = NULL;
>> int ret = -1;
>>
>> storageDriverLock();
>> @@ -840,6 +867,8 @@ storagePoolDestroy(virStoragePoolPtr obj)
>> if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
>> goto cleanup;
>>
>> + VIR_INFO("Destroying storage pool '%s'", pool->def->name);
>> +
>> if (!virStoragePoolObjIsActive(pool)) {
>> virReportError(VIR_ERR_OPERATION_INVALID,
>> _("storage pool '%s' is not active"), pool->def->name);
>> @@ -853,6 +882,14 @@ storagePoolDestroy(virStoragePoolPtr obj)
>> goto cleanup;
>> }
>>
>> + if (!(stateFile = virFileBuildPath(driver->stateDir,
>> + pool->def->name,
>> + ".xml")))
>> + goto cleanup;
>> +
>> + unlink(stateFile);
>> + VIR_FREE(stateFile);
>> +
>> if (backend->stopPool &&
>> backend->stopPool(obj->conn, pool) < 0)
>> goto cleanup;
>> @@ -860,7 +897,6 @@ storagePoolDestroy(virStoragePoolPtr obj)
>> virStoragePoolObjClearVols(pool);
>>
>> pool->active = 0;
>> - VIR_INFO("Shutting down storage pool '%s'", pool->def->name);
>>
>> if (pool->configFile == NULL) {
>> virStoragePoolObjRemove(&driver->pools, pool);
>> @@ -870,6 +906,7 @@ storagePoolDestroy(virStoragePoolPtr obj)
>> pool->def = pool->newDef;
>> pool->newDef = NULL;
>> }
>> +
>> ret = 0;
>>
>> cleanup:
>> @@ -885,6 +922,7 @@ storagePoolDelete(virStoragePoolPtr obj,
>> {
>> virStoragePoolObjPtr pool;
>> virStorageBackendPtr backend;
>> + char *stateFile = NULL;
>> int ret = -1;
>>
>> if (!(pool = virStoragePoolObjFromStoragePool(obj)))
>> @@ -896,6 +934,8 @@ storagePoolDelete(virStoragePoolPtr obj,
>> if ((backend = virStorageBackendForType(pool->def->type)) == NULL)
>> goto cleanup;
>>
>> + VIR_INFO("Deleting storage pool '%s'", pool->def->name);
>> +
>> if (virStoragePoolObjIsActive(pool)) {
>> virReportError(VIR_ERR_OPERATION_INVALID,
>> _("storage pool '%s' is still active"),
>> @@ -910,6 +950,14 @@ storagePoolDelete(virStoragePoolPtr obj,
>> goto cleanup;
>> }
>>
>> + if (!(stateFile = virFileBuildPath(driver->stateDir,
>> + pool->def->name,
>> + ".xml")))
>> + goto cleanup;
>> +
>> + unlink(stateFile);
>> + VIR_FREE(stateFile);
>> +
>> if (!backend->deletePool) {
>> virReportError(VIR_ERR_NO_SUPPORT,
>> "%s", _("pool does not support pool deletion"));
>> @@ -917,7 +965,7 @@ storagePoolDelete(virStoragePoolPtr obj,
>> }
>> if (backend->deletePool(obj->conn, pool, flags) < 0)
>> goto cleanup;
>> - VIR_INFO("Deleting storage pool '%s'", pool->def->name);
>> +
>> ret = 0;
>>
>> cleanup:
>>
More information about the libvir-list
mailing list