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 virStorageBackendISCSITargetAutologin(const char *portal, const char *initiatoriqn, const char *target, bool enable) { const char *extraargv[] = { "--op", "update", "--name", "node.startup", "--value", enable ? "automatic" : "manual", NULL }; return virStorageBackendISCSIConnection(portal, initiatoriqn, target, extraargv); }
static int virStorageBackendISCSILogin(virStoragePoolObjPtr pool, const char *portal) { const char *const cmdsendtarget[] = { ISCSIADM, "--mode", "discovery", "--type", "sendtargets", "--portal", portal, NULL }; if (virRun(cmdsendtarget, NULL) < 0) return -1; return virStorageBackendISCSIConnection(pool, portal, "--login"); }
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 int virStorageBackendISCSILogout(virStoragePoolObjPtr pool, const char *portal) { return virStorageBackendISCSIConnection(pool, portal, "--logout"); }