# endif
} virStoragePoolState;
-
typedef enum {
VIR_STORAGE_POOL_BUILD_NEW = 0, /* Regular build from scratch */
VIR_STORAGE_POOL_BUILD_REPAIR = (1 << 0), /* Repair / reinitialize */
VIR_STORAGE_POOL_DELETE_ZEROED = 1 << 0, /* Clear all data to zeros (slow) */
} virStoragePoolDeleteFlags;
+typedef enum {
+ VIR_STORAGE_POOL_CREATE_NORMAL = 0,
+
+ /* Create the pool and perform pool build without any flags */
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD = 1 << 0,
+
+ /* Create the pool and perform pool build using the
+ * VIR_STORAGE_POOL_BUILD_OVERWRITE flag. This is mutually
+ * exclusive to VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE */
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE = 1 << 1,
+
+ /* Create the pool and perform pool build using the
+ * VIR_STORAGE_POOL_BUILD_NO_OVERWRITE flag. This is mutually
+ * exclusive to VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE */
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE = 1 << 2,
+} virStoragePoolCreateFlags;
+
typedef struct _virStoragePoolInfo virStoragePoolInfo;
struct _virStoragePoolInfo {
* virStoragePoolCreateXML:
* @conn: pointer to hypervisor connection
* @xmlDesc: XML description for new pool
- * @flags: extra flags; not used yet, so callers should always pass 0
+ * @flags: bitwise-OR of virStoragePoolCreateFlags
*
* Create a new storage based on its XML description. The
* pool is not persistent, so its definition will disappear
/**
* virStoragePoolCreate:
* @pool: pointer to storage pool
- * @flags: extra flags; not used yet, so callers should always pass 0
+ * @flags: bitwise-OR of virStoragePoolCreateFlags
*
* Starts an inactive storage pool
*
virStoragePoolPtr ret = NULL;
virStorageBackendPtr backend;
char *stateFile = NULL;
+ unsigned int build_flags = 0;
- virCheckFlags(0, NULL);
+ virCheckFlags(VIR_STORAGE_POOL_CREATE_WITH_BUILD |
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE |
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE, NULL);
+
+ VIR_EXCLUSIVE_FLAGS_RET(VIR_STORAGE_POOL_BUILD_OVERWRITE,
+ VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, NULL);
storageDriverLock();
if (!(def = virStoragePoolDefParseString(xml)))
goto cleanup;
def = NULL;
+ if (backend->buildPool) {
+ if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE)
+ build_flags |= VIR_STORAGE_POOL_BUILD_OVERWRITE;
+ else if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE)
+ build_flags |= VIR_STORAGE_POOL_BUILD_NO_OVERWRITE;
+
+ if (build_flags ||
+ (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) {
+ if (backend->buildPool(conn, pool, build_flags) < 0) {
+ virStoragePoolObjRemove(&driver->pools, pool);
+ pool = NULL;
+ goto cleanup;
+ }
+ }
+ }
+
if (backend->startPool &&
backend->startPool(conn, pool) < 0) {
virStoragePoolObjRemove(&driver->pools, pool);
virStorageBackendPtr backend;
int ret = -1;
char *stateFile = NULL;
+ unsigned int build_flags = 0;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_STORAGE_POOL_CREATE_WITH_BUILD |
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE |
+ VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE, -1);
+
+ VIR_EXCLUSIVE_FLAGS_RET(VIR_STORAGE_POOL_BUILD_OVERWRITE,
+ VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, -1);
if (!(pool = virStoragePoolObjFromStoragePool(obj)))
return -1;
goto cleanup;
}
+ if (backend->buildPool) {
+ if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE)
+ build_flags |= VIR_STORAGE_POOL_BUILD_OVERWRITE;
+ else if (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE)
+ build_flags |= VIR_STORAGE_POOL_BUILD_NO_OVERWRITE;
+
+ if (build_flags ||
+ (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) {
+ if (backend->buildPool(obj->conn, pool, build_flags) < 0) {
+ virStoragePoolObjRemove(&driver->pools, pool);
+ pool = NULL;
+ goto cleanup;
+ }
+ }
+ }
+
VIR_INFO("Starting up storage pool '%s'", pool->def->name);
if (backend->startPool &&
backend->startPool(obj->conn, pool) < 0)