1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

storage: Add startPool and stopPool for scsi backend

startPool creates the vHBA if it's not existed yet, stopPool destroys
the vHBA. Also to support autostart, checkPool will creates the vHBA
if it's not existed yet.
This commit is contained in:
Osier Yang 2013-03-26 00:43:41 +08:00
parent b52fbad150
commit 34f9651005

View File

@ -644,6 +644,62 @@ getAdapterName(virStoragePoolSourceAdapter adapter)
return name;
}
static int
createVport(virStoragePoolSourceAdapter adapter)
{
unsigned int parent_host;
char *name = NULL;
if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
return 0;
/* This filters either HBA or already created vHBA */
if ((name = virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
adapter.data.fchost.wwpn))) {
VIR_FREE(name);
return 0;
}
if (!adapter.data.fchost.parent) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("'parent' for vHBA must be specified"));
return -1;
}
if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
return -1;
if (virManageVport(parent_host, adapter.data.fchost.wwnn,
adapter.data.fchost.wwpn, VPORT_CREATE) < 0)
return -1;
virFileWaitForDevices();
return 0;
}
static int
deleteVport(virStoragePoolSourceAdapter adapter)
{
unsigned int parent_host;
if (adapter.type != VIR_STORAGE_POOL_SOURCE_ADAPTER_TYPE_FC_HOST)
return 0;
if (!(virGetFCHostNameByWWN(NULL, adapter.data.fchost.wwnn,
adapter.data.fchost.wwpn)))
return -1;
if (getHostNumber(adapter.data.fchost.parent, &parent_host) < 0)
return -1;
if (virManageVport(parent_host, adapter.data.fchost.wwnn,
adapter.data.fchost.wwpn, VPORT_DELETE) < 0)
return -1;
return 0;
}
static int
virStorageBackendSCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool,
@ -706,10 +762,27 @@ out:
return ret;
}
static int
virStorageBackendSCSIStartPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool)
{
virStoragePoolSourceAdapter adapter = pool->def->source.adapter;
return createVport(adapter);
}
static int
virStorageBackendSCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED,
virStoragePoolObjPtr pool)
{
virStoragePoolSourceAdapter adapter = pool->def->source.adapter;
return deleteVport(adapter);
}
virStorageBackend virStorageBackendSCSI = {
.type = VIR_STORAGE_POOL_SCSI,
.checkPool = virStorageBackendSCSICheckPool,
.refreshPool = virStorageBackendSCSIRefreshPool,
.startPool = virStorageBackendSCSIStartPool,
.stopPool = virStorageBackendSCSIStopPool,
};