void gvir_config_storage_vol_set_allocation(GVirConfigStorageVol *vol,
                                            guint64 allocation)
{
    g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));

    gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(vol),
                                               "allocation", allocation);
}
void gvir_config_storage_vol_set_capacity(GVirConfigStorageVol *vol,
                                          guint64 capacity)
{
    g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));

    gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(vol),
                                               "capacity", capacity);
}
/**
 * gvir_config_storage_vol_set_name:
 * @name: (allow-none):
 */
void gvir_config_storage_vol_set_name(GVirConfigStorageVol *vol,
                                      const char *name)
{
    g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));

    gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(vol),
                                        "name", name);
}
/**
 * gvir_config_storage_vol_set_backing_store:
 * @backing_store: (allow-none):
 */
void gvir_config_storage_vol_set_backing_store(GVirConfigStorageVol *vol,
                                               GVirConfigStorageVolBackingStore *backing_store)
{
    g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
    g_return_if_fail(backing_store == NULL ||
                     GVIR_CONFIG_IS_STORAGE_VOL_BACKING_STORE(backing_store));

    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
                                      "backingStore",
                                      GVIR_CONFIG_OBJECT(backing_store));
}
/**
 * gvir_config_storage_vol_set_target:
 * @target: (allow-none):
 */
void gvir_config_storage_vol_set_target(GVirConfigStorageVol *vol,
                                        GVirConfigStorageVolTarget *target)
{
    g_return_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(vol));
    g_return_if_fail(target == NULL ||
                     GVIR_CONFIG_IS_STORAGE_VOL_TARGET(target));

    gvir_config_object_attach_replace(GVIR_CONFIG_OBJECT(vol),
                                      "target",
                                      GVIR_CONFIG_OBJECT(target));
}
/**
 * gvir_storage_pool_create_volume:
 * @pool: the storage pool in which to create the volume
 * @conf: the configuration for the new volume
 * @err: Place-holder for possible errors
 *
 * Returns: (transfer full): the newly created volume. The returned object
 * should be unreffed with g_object_unref() when no longer needed.
 */
GVirStorageVol *gvir_storage_pool_create_volume
                                (GVirStoragePool *pool,
                                 GVirConfigStorageVol *conf,
                                 GError **err)
{
    const gchar *xml;
    virStorageVolPtr handle;
    GVirStoragePoolPrivate *priv;

    g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), NULL);
    g_return_val_if_fail(GVIR_CONFIG_IS_STORAGE_VOL(conf), NULL);
    g_return_val_if_fail(err == NULL || *err == NULL, NULL);

    xml = gvir_config_object_to_xml(GVIR_CONFIG_OBJECT(conf));

    g_return_val_if_fail(xml != NULL, NULL);

    priv = pool->priv;
    if (!(handle = virStorageVolCreateXML(priv->handle, xml, 0))) {
        gvir_set_error_literal(err, GVIR_STORAGE_POOL_ERROR,
                               0,
                               "Failed to create volume");
        return NULL;
    }

    GVirStorageVol *volume;
    const char *name;

    volume = GVIR_STORAGE_VOL(g_object_new(GVIR_TYPE_STORAGE_VOL,
                                           "handle", handle,
                                           "pool", pool,
                                           NULL));
    name = gvir_storage_vol_get_name(volume);
    if (name == NULL) {
        g_object_unref(G_OBJECT(volume));
        return NULL;
    }

    g_mutex_lock(priv->lock);
    if (priv->volumes != NULL) {
        g_hash_table_insert(priv->volumes, g_strdup(name), volume);
    } else {
        g_warn_if_reached();
        g_object_unref(G_OBJECT(volume));
        g_mutex_unlock(priv->lock);
        return NULL;
    }
    g_mutex_unlock(priv->lock);

    return g_object_ref(volume);
}