#include <config.h>
-#include "storage_adapter_conf.h"
+#include "storage_conf.h"
#include "viralloc.h"
#include "virerror.h"
VIR_LOG_INIT("conf.storage_adapter_conf");
-VIR_ENUM_IMPL(virStoragePoolSourceAdapter,
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST,
+VIR_ENUM_IMPL(virStorageAdapter,
+ VIR_STORAGE_ADAPTER_TYPE_LAST,
"default", "scsi_host", "fc_host")
-
static void
virStorageAdapterClearFCHost(virStorageAdapterFCHostPtr fchost)
{
void
-virStorageAdapterClear(virStoragePoolSourceAdapterPtr adapter)
+virStorageAdapterClear(virStorageAdapterPtr adapter)
{
- if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST)
virStorageAdapterClearFCHost(&adapter->data.fchost);
- if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST)
VIR_FREE(adapter->data.scsi_host.name);
}
static int
virStorageAdapterParseXMLLegacy(xmlNodePtr node,
xmlXPathContextPtr ctxt,
- virStoragePoolSourceAdapterPtr adapter)
+ virStorageAdapterPtr adapter)
{
char *wwnn = virXMLPropString(node, "wwnn");
char *wwpn = virXMLPropString(node, "wwpn");
* for scsi_host adapter.
*/
if ((adapter->data.scsi_host.name = virXMLPropString(node, "name")))
- adapter->type = VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST;
+ adapter->type = VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST;
return 0;
}
int
-virStorageAdapterParseXML(virStoragePoolSourcePtr source,
+virStorageAdapterParseXML(virStorageAdapterPtr adapter,
xmlNodePtr node,
xmlXPathContextPtr ctxt)
{
ctxt->node = node;
if ((adapter_type = virXMLPropString(node, "type"))) {
- if ((source->adapter.type =
- virStoragePoolSourceAdapterTypeFromString(adapter_type)) <= 0) {
+ if ((adapter->type =
+ virStorageAdapterTypeFromString(adapter_type)) <= 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Unknown pool adapter type '%s'"),
adapter_type);
goto cleanup;
}
- if (source->adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
- if (virStorageAdapterParseXMLFCHost(node, &source->adapter.data.fchost) < 0)
- goto cleanup;
- } else if (source->adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
- if (virStorageAdapterParseXMLSCSIHost(node, ctxt, &source->adapter.data.scsi_host) < 0)
+ if ((adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST) &&
+ (virStorageAdapterParseXMLFCHost(node, &adapter->data.fchost)) < 0)
goto cleanup;
- }
+ if ((adapter->type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) &&
+ (virStorageAdapterParseXMLSCSIHost(node, ctxt,
+ &adapter->data.scsi_host)) < 0)
+ goto cleanup;
} else {
- if (virStorageAdapterParseXMLLegacy(node, ctxt, &source->adapter) < 0)
+ if (virStorageAdapterParseXMLLegacy(node, ctxt, adapter) < 0)
goto cleanup;
}
int
-virStorageAdapterValidate(virStoragePoolDefPtr ret)
+virStorageAdapterValidate(virStorageAdapterPtr adapter)
{
- if (!ret->source.adapter.type) {
+ if (!adapter->type) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("missing storage pool source adapter"));
return -1;
}
- if (ret->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
- return virStorageAdapterValidateFCHost(&ret->source.adapter.data.fchost);
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST)
+ return virStorageAdapterValidateFCHost(&adapter->data.fchost);
- if (ret->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
- return virStorageAdapterValidateSCSIHost(&ret->source.adapter.data.scsi_host);
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST)
+ return virStorageAdapterValidateSCSIHost(&adapter->data.scsi_host);
return 0;
}
virStorageAdapterFCHostPtr fchost)
{
virBufferEscapeString(buf, " parent='%s'", fchost->parent);
- if (fchost->managed)
- virBufferAsprintf(buf, " managed='%s'",
- virTristateBoolTypeToString(fchost->managed));
virBufferEscapeString(buf, " parent_wwnn='%s'", fchost->parent_wwnn);
virBufferEscapeString(buf, " parent_wwpn='%s'", fchost->parent_wwpn);
virBufferEscapeString(buf, " parent_fabric_wwn='%s'",
fchost->parent_fabric_wwn);
+ if (fchost->managed != VIR_TRISTATE_BOOL_ABSENT)
+ virBufferAsprintf(buf, " managed='%s'",
+ virTristateBoolTypeToString(fchost->managed));
virBufferAsprintf(buf, " wwnn='%s' wwpn='%s'/>\n",
fchost->wwnn, fchost->wwpn);
void
virStorageAdapterFormat(virBufferPtr buf,
- virStoragePoolSourcePtr src)
+ virStorageAdapterPtr adapter)
{
virBufferAsprintf(buf, "<adapter type='%s'",
- virStoragePoolSourceAdapterTypeToString(src->adapter.type));
+ virStorageAdapterTypeToString(adapter->type));
- if (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
- virStorageAdapterFormatFCHost(buf, &src->adapter.data.fchost);
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST)
+ virStorageAdapterFormatFCHost(buf, &adapter->data.fchost);
- if (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST)
- virStorageAdapterFormatSCSIHost(buf, &src->adapter.data.scsi_host);
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST)
+ virStorageAdapterFormatSCSIHost(buf, &adapter->data.scsi_host);
}
# include "virpci.h"
# include "virxml.h"
-# include "storage_conf.h"
+
+typedef enum {
+ VIR_STORAGE_ADAPTER_TYPE_DEFAULT = 0,
+ VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST,
+ VIR_STORAGE_ADAPTER_TYPE_FC_HOST,
+
+ VIR_STORAGE_ADAPTER_TYPE_LAST,
+} virStorageAdapterType;
+VIR_ENUM_DECL(virStorageAdapter)
+
+typedef struct _virStorageAdapterSCSIHost virStorageAdapterSCSIHost;
+typedef virStorageAdapterSCSIHost *virStorageAdapterSCSIHostPtr;
+struct _virStorageAdapterSCSIHost {
+ char *name;
+ virPCIDeviceAddress parentaddr; /* host address */
+ int unique_id;
+ bool has_parent;
+};
+
+typedef struct _virStorageAdapterFCHost virStorageAdapterFCHost;
+typedef virStorageAdapterFCHost *virStorageAdapterFCHostPtr;
+struct _virStorageAdapterFCHost {
+ char *parent;
+ char *parent_wwnn;
+ char *parent_wwpn;
+ char *parent_fabric_wwn;
+ char *wwnn;
+ char *wwpn;
+ int managed; /* enum virTristateSwitch */
+};
+
+typedef struct _virStorageAdapter virStorageAdapter;
+typedef virStorageAdapter *virStorageAdapterPtr;
+struct _virStorageAdapter {
+ int type; /* virStorageAdapterType */
+
+ union {
+ virStorageAdapterSCSIHost scsi_host;
+ virStorageAdapterFCHost fchost;
+ } data;
+};
+
void
-virStorageAdapterClear(virStoragePoolSourceAdapterPtr adapter);
+virStorageAdapterClear(virStorageAdapterPtr adapter);
int
-virStorageAdapterParseXML(virStoragePoolSourcePtr source,
+virStorageAdapterParseXML(virStorageAdapterPtr adapter,
xmlNodePtr node,
xmlXPathContextPtr ctxt);
int
-virStorageAdapterValidate(virStoragePoolDefPtr ret);
+virStorageAdapterValidate(virStorageAdapterPtr adapter);
void
virStorageAdapterFormat(virBufferPtr buf,
- virStoragePoolSourcePtr src);
+ virStorageAdapterPtr adapter);
#endif /* __VIR_STORAGE_ADAPTER_CONF_H__ */
goto cleanup;
if ((adapternode = virXPathNode("./adapter", ctxt))) {
- if (virStorageAdapterParseXML(source, adapternode, ctxt) < 0)
+ if (virStorageAdapterParseXML(&source->adapter, adapternode, ctxt) < 0)
goto cleanup;
}
}
if ((options->flags & VIR_STORAGE_POOL_SOURCE_ADAPTER) &&
- (virStorageAdapterValidate(ret)) < 0)
+ (virStorageAdapterValidate(&ret->source.adapter)) < 0)
goto error;
/* If DEVICE is the only source type, then its required */
virBufferEscapeString(buf, "<dir path='%s'/>\n", src->dir);
if ((options->flags & VIR_STORAGE_POOL_SOURCE_ADAPTER) &&
- (src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST ||
- src->adapter.type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST))
- virStorageAdapterFormat(buf, src);
+ (src->adapter.type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST ||
+ src->adapter.type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST))
+ virStorageAdapterFormat(buf, &src->adapter);
if (options->flags & VIR_STORAGE_POOL_SOURCE_NAME)
virBufferEscapeString(buf, "<name>%s</name>\n", src->name);
int ret = 1;
virStoragePoolObjPtr pool = NULL;
virStoragePoolObjPtr matchpool = NULL;
- virStoragePoolSourceAdapterPtr pool_adapter;
- virStoragePoolSourceAdapterPtr def_adapter;
+ virStorageAdapterPtr pool_adapter;
+ virStorageAdapterPtr def_adapter;
/* Check the pool list for duplicate underlying storage */
for (i = 0; i < pools->count; i++) {
pool_adapter = &pool->def->source.adapter;
def_adapter = &def->source.adapter;
- if (pool_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST &&
- def_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ if (pool_adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST &&
+ def_adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
virStorageAdapterFCHostPtr pool_fchost =
&pool_adapter->data.fchost;
virStorageAdapterFCHostPtr def_fchost =
STREQ(pool_fchost->wwpn, def_fchost->wwpn))
matchpool = pool;
} else if (pool_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST &&
+ VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST &&
def_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
+ VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) {
virStorageAdapterSCSIHostPtr pool_scsi_host =
&pool_adapter->data.scsi_host;
virStorageAdapterSCSIHostPtr def_scsi_host =
if (pool_hostnum == def_hostnum)
matchpool = pool;
} else if (pool_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST &&
+ VIR_STORAGE_ADAPTER_TYPE_FC_HOST &&
def_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
+ VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) {
virStorageAdapterFCHostPtr pool_fchost =
&pool_adapter->data.fchost;
virStorageAdapterSCSIHostPtr def_scsi_host =
}
} else if (pool_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST &&
+ VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST &&
def_adapter->type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
virStorageAdapterSCSIHostPtr pool_scsi_host =
&pool_adapter->data.scsi_host;
virStorageAdapterFCHostPtr def_fchost =
# include "virthread.h"
# include "device_conf.h"
# include "object_event.h"
+# include "storage_adapter_conf.h"
# include <libxml/tree.h>
} geometry;
};
-typedef enum {
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_DEFAULT = 0,
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST,
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST,
-
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_LAST,
-} virStoragePoolSourceAdapterType;
-VIR_ENUM_DECL(virStoragePoolSourceAdapter)
-
-typedef struct _virStorageAdapterSCSIHost virStorageAdapterSCSIHost;
-typedef virStorageAdapterSCSIHost *virStorageAdapterSCSIHostPtr;
-struct _virStorageAdapterSCSIHost {
- char *name;
- virPCIDeviceAddress parentaddr; /* host address */
- int unique_id;
- bool has_parent;
-};
-
-typedef struct _virStorageAdapterFCHost virStorageAdapterFCHost;
-typedef virStorageAdapterFCHost *virStorageAdapterFCHostPtr;
-struct _virStorageAdapterFCHost {
- char *parent;
- char *parent_wwnn;
- char *parent_wwpn;
- char *parent_fabric_wwn;
- char *wwnn;
- char *wwpn;
- int managed; /* enum virTristateSwitch */
-};
-
-typedef struct _virStoragePoolSourceAdapter virStoragePoolSourceAdapter;
-typedef virStoragePoolSourceAdapter *virStoragePoolSourceAdapterPtr;
-struct _virStoragePoolSourceAdapter {
- int type; /* virStoragePoolSourceAdapterType */
-
- union {
- virStorageAdapterSCSIHost scsi_host;
- virStorageAdapterFCHost fchost;
- } data;
-};
-
typedef struct _virStoragePoolSource virStoragePoolSource;
typedef virStoragePoolSource *virStoragePoolSourcePtr;
struct _virStoragePoolSource {
char *dir;
/* Or an adapter */
- virStoragePoolSourceAdapter adapter;
+ virStorageAdapter adapter;
/* Or a name */
char *name;
virStoragePoolObjUnlock;
virStoragePoolSaveConfig;
virStoragePoolSaveState;
-virStoragePoolSourceAdapterTypeFromString;
-virStoragePoolSourceAdapterTypeToString;
virStoragePoolSourceClear;
virStoragePoolSourceDeviceClear;
virStoragePoolSourceFindDuplicate;
int exit_status = 0;
virBuffer buf = VIR_BUFFER_INITIALIZER;
- if (source.adapter.type !=
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
+ if (source.adapter.type != VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("Only 'scsi_host' adapter is supported"));
goto cleanup;
}
static char *
-getAdapterName(virStoragePoolSourceAdapterPtr adapter)
+getAdapterName(virStorageAdapterPtr adapter)
{
char *name = NULL;
char *parentaddr = NULL;
- if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_SCSI_HOST) {
+ if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) {
virStorageAdapterSCSIHostPtr scsi_host = &adapter->data.scsi_host;
if (scsi_host->has_parent) {
} else {
ignore_value(VIR_STRDUP(name, scsi_host->name));
}
- } else if (adapter->type == VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ } else if (adapter->type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
virStorageAdapterFCHostPtr fchost = &adapter->data.fchost;
if (!(name = virVHBAGetHostByWWN(NULL, fchost->wwnn, fchost->wwpn))) {
* the adapter based on might be not created yet.
*/
if (pool->def->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
virResetLastError();
return 0;
} else {
return ret;
}
+
static int
virStorageBackendSCSIStartPool(virConnectPtr conn,
virStoragePoolObjPtr pool)
{
- if (pool->def->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
+ if (pool->def->source.adapter.type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST)
return createVport(conn, pool->def, pool->configFile,
&pool->def->source.adapter.data.fchost);
return 0;
}
+
static int
virStorageBackendSCSIStopPool(virConnectPtr conn,
virStoragePoolObjPtr pool)
{
- if (pool->def->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
+ if (pool->def->source.adapter.type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST)
return deleteVport(conn, &pool->def->source.adapter.data.fchost);
return 0;
goto cleanup;
def = NULL;
- if (pool->def->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ if (pool->def->source.adapter.type == VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
/* In the real code, we'd call virVHBAManageVport followed by
* find_new_device, but we cannot do that here since we're not
* mocking udev. The mock routine will copy an existing vHBA and
privpool->active = 0;
if (privpool->def->source.adapter.type ==
- VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST) {
+ VIR_STORAGE_ADAPTER_TYPE_FC_HOST) {
if (testDestroyVport(privconn,
privpool->def->source.adapter.data.fchost.wwnn,
privpool->def->source.adapter.data.fchost.wwpn) < 0)