提交 34f96510 编写于 作者: O Osier Yang

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.
上级 b52fbad1
......@@ -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,
};
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册