static int virStorageBackendISCSIStartPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool) { char *portal = NULL; char *session; if (pool->def->source.host.name == NULL) { virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source host")); return -1; } if (pool->def->source.ndevice != 1 || pool->def->source.devices[0].path == NULL) { virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source device")); return -1; } if ((session = virStorageBackendISCSISession(pool, 1)) == NULL) { if ((portal = virStorageBackendISCSIPortal(pool)) == NULL) return -1; if (virStorageBackendISCSILogin(pool, portal) < 0) { VIR_FREE(portal); return -1; } VIR_FREE(portal); } else { VIR_FREE(session); } return 0; }
static int virStorageBackendISCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool) { char *portal; char *session; int ret = -1; if ((session = virStorageBackendISCSISession(pool, true)) == NULL) return 0; VIR_FREE(session); if ((portal = virStorageBackendISCSIPortal(&pool->def->source)) == NULL) return -1; if (virISCSIConnectionLogout(portal, pool->def->source.initiator.iqn, pool->def->source.devices[0].path) < 0) goto cleanup; ret = 0; cleanup: VIR_FREE(portal); return ret; }
static int virStorageBackendISCSIStartPool(virConnectPtr conn, virStoragePoolObjPtr pool) { char *portal = NULL; char *session = NULL; int ret = -1; const char *loginargv[] = { "--login", NULL }; if (pool->def->source.nhost != 1) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Expected exactly 1 host for the storage pool")); return -1; } if (pool->def->source.hosts[0].name == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source host")); return -1; } if (pool->def->source.ndevice != 1 || pool->def->source.devices[0].path == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source device")); return -1; } if ((session = virStorageBackendISCSISession(pool, 1)) == NULL) { if ((portal = virStorageBackendISCSIPortal(&pool->def->source)) == NULL) goto cleanup; /* * iscsiadm doesn't let you login to a target, unless you've * first issued a 'sendtargets' command to the portal :-( */ if (virStorageBackendISCSIScanTargets(portal, pool->def->source.initiator.iqn, NULL, NULL) < 0) goto cleanup; if (virStorageBackendISCSISetAuth(portal, conn, pool->def) < 0) goto cleanup; if (virStorageBackendISCSIConnection(portal, pool->def->source.initiator.iqn, pool->def->source.devices[0].path, loginargv) < 0) goto cleanup; } ret = 0; cleanup: VIR_FREE(portal); VIR_FREE(session); return ret; }
static int virStorageBackendISCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool) { char *portal; if ((portal = virStorageBackendISCSIPortal(pool)) == NULL) return -1; if (virStorageBackendISCSILogout(pool, portal) < 0) { VIR_FREE(portal); return -1; } VIR_FREE(portal); return 0; }
static int virStorageBackendISCSIStopPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool) { const char *logoutargv[] = { "--logout", NULL }; char *portal; int ret = -1; if ((portal = virStorageBackendISCSIPortal(&pool->def->source)) == NULL) return -1; if (virStorageBackendISCSIConnection(portal, pool->def->source.initiator.iqn, pool->def->source.devices[0].path, logoutargv) < 0) goto cleanup; ret = 0; cleanup: VIR_FREE(portal); return ret; }
static char * virStorageBackendISCSIFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED, const char *srcSpec, unsigned int flags) { virStoragePoolSourcePtr source = NULL; size_t ntargets = 0; char **targets = NULL; char *ret = NULL; int i; virStoragePoolSourceList list = { .type = VIR_STORAGE_POOL_ISCSI, .nsources = 0, .sources = NULL }; char *portal = NULL; virCheckFlags(0, NULL); if (!(source = virStoragePoolDefParseSourceString(srcSpec, list.type))) return NULL; if (!(portal = virStorageBackendISCSIPortal(source))) goto cleanup; if (virStorageBackendISCSIScanTargets(portal, source->initiator.iqn, &ntargets, &targets) < 0) goto cleanup; if (VIR_ALLOC_N(list.sources, ntargets) < 0) { virReportOOMError(); goto cleanup; } for (i = 0 ; i < ntargets ; i++) { if (VIR_ALLOC_N(list.sources[i].devices, 1) < 0) { virReportOOMError(); goto cleanup; } list.sources[i].host = source->host; list.sources[i].initiator = source->initiator; list.sources[i].ndevice = 1; list.sources[i].devices[0].path = targets[i]; list.nsources++; } if (!(ret = virStoragePoolSourceListFormat(&list))) { virReportOOMError(); goto cleanup; } cleanup: if (list.sources) { for (i = 0 ; i < ntargets ; i++) VIR_FREE(list.sources[i].devices); VIR_FREE(list.sources); } for (i = 0 ; i < ntargets ; i++) VIR_FREE(targets[i]); VIR_FREE(targets); VIR_FREE(portal); virStoragePoolSourceFree(source); return ret; } static int virStorageBackendISCSICheckPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool, bool *isActive) { char *session = NULL; int ret = -1; *isActive = false; if (pool->def->source.host.name == NULL) { virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source host")); return -1; } if (pool->def->source.ndevice != 1 || pool->def->source.devices[0].path == NULL) { virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing source device")); return -1; } if ((session = virStorageBackendISCSISession(pool, 1)) != NULL) { *isActive = true; VIR_FREE(session); } ret = 0; return ret; }