
libvir-list-bounces@redhat.com wrote on 05/13/2010 10:53:53 AM:
Hello all,
This is the first patch about storage management driver on IBM Power Hypervisor. I reviewd a couple of times but perhaps I might be missing something. Any comments are welcome.
Please send the patches inline.
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index cec99b1..7bd203f 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1665,6 +1665,262 @@ virDriver phypDriver = { NULL, /* domainSnapshotDelete */ };
+virStorageDriver phypStorageDriver = { + .name = "PHYP", + .open = phypStorageOpen, + .close = phypStorageClose, + + .numOfPools = phypNumOfStoragePools, + .listPools = phypListStoragePools, + .numOfDefinedPools = NULL, + .listDefinedPools = NULL, + .findPoolSources = NULL, + .poolLookupByName = phypSPLookupByName, + .poolLookupByUUID = NULL, + .poolLookupByVolume = NULL, + .poolCreateXML = NULL, + .poolDefineXML = NULL, + .poolBuild = NULL, + .poolUndefine = NULL, + .poolCreate = NULL, + .poolDestroy = NULL, + .poolDelete = NULL, + .poolRefresh = NULL, + .poolGetInfo = NULL, + .poolGetXMLDesc = NULL, + .poolGetAutostart = NULL, + .poolSetAutostart = NULL, + .poolNumOfVolumes = NULL, + .poolListVolumes = NULL, + + .volLookupByName = NULL, + .volLookupByKey = NULL, + .volLookupByPath = NULL, + .volCreateXML = NULL, + .volCreateXMLFrom = NULL, + .volDelete = NULL, + .volGetInfo = NULL, + .volGetXMLDesc = NULL, + .volGetPath = NULL, + .poolIsActive = NULL, + .poolIsPersistent = NULL +}; + +int +phypGetStoragePoolUUID(unsigned char *sp_uuid, const char *sp_name, + virConnectPtr conn) +{ + ConnectionData *connection_data = conn->networkPrivateData; + phyp_driverPtr phyp_driver = conn->privateData; + LIBSSH2_SESSION *session = connection_data->session; + char *managed_system = phyp_driver->managed_system; + int vios_id = phyp_driver->vios_id; + int exit_status = 0; + char *cmd = NULL; + char *ret = NULL; + + if (virAsprintf(&cmd, + "viosvrcmd -m %s --id %d -c 'lsdev -dev %s -attr " + "vgserial_id'|sed '1d'|sed '1d'", + managed_system, vios_id, sp_name, sp_name) < 0) { + virReportOOMError(); + goto err; + } + + ret = phypExec(session, cmd, &exit_status, conn); + + if (exit_status < 0 || ret == NULL) + goto err; + + if (memmove(sp_uuid, ret, VIR_UUID_BUFLEN) == NULL) + goto err; + + VIR_FREE(cmd); + VIR_FREE(ret); + return 0; + + err: + VIR_FREE(cmd); + VIR_FREE(ret); + return -1; +} + +int +phypGetStoragePoolID(const char *sp_name, virConnectPtr conn) +{ + ConnectionData *connection_data = conn->networkPrivateData; + phyp_driverPtr phyp_driver = conn->privateData; + LIBSSH2_SESSION *session = connection_data->session; + char *managed_system = phyp_driver->managed_system; + int vios_id = phyp_driver->vios_id; + int exit_status = 0; + int sp_id = 0; + char *char_ptr; + char *cmd = NULL; + char *ret = NULL; + + if (virAsprintf(&cmd, + "viosvrcmd -m %s --id %d -c 'lssp -field Pool'" + "|sed '1d'|grep -n %s|sed -e 's/:.*$//g'", + managed_system, vios_id, sp_name) < 0) { + virReportOOMError(); + goto err; + } + + ret = phypExec(session, cmd, &exit_status, conn); + + if (exit_status < 0 || ret == NULL) + goto err; + + if (virStrToLong_i(ret, &char_ptr, 10, &sp_id) == -1) + goto err;
char_ptr not being used afterward -> could supply NULL instead.
+ + VIR_FREE(cmd); + VIR_FREE(ret); + return sp_id; + + err: + VIR_FREE(cmd); + VIR_FREE(ret); + return -1; +} + +virStoragePoolPtr +phypSPLookupByName(virConnectPtr conn, const char *sp_name) +{ + virStoragePoolPtr sp = NULL; + int sp_id = 0; + unsigned char sp_uuid[VIR_UUID_BUFLEN]; + + sp_id = phypGetStoragePoolID(sp_name, conn); + if (sp_id == -1) + return NULL; + + if (phypGetStoragePoolUUID(sp_uuid, sp_name, conn) == -1) + return NULL; + + sp = virGetStoragePool(conn, sp_name, sp_uuid); + + if (sp) + return sp; + else + return NULL;
Doesn't seem necessary to do if - then here. Just a 'return sp;' should do the trick.
+} + +int +phypNumOfStoragePools(virConnectPtr conn)
Make this one static since it's accessed through the interface? Or is it exported for some debugging purpose?
+{ + ConnectionData *connection_data = conn->networkPrivateData; + phyp_driverPtr phyp_driver = conn->privateData; + LIBSSH2_SESSION *session = connection_data->session; + int exit_status = 0; + int nsp = 0; + char *char_ptr; + char *cmd = NULL; + char *ret = NULL; + char *managed_system = phyp_driver->managed_system; + int vios_id = phyp_driver->vios_id; + + if (virAsprintf(&cmd, + "viosvrcmd -m %s --id %d -c 'lssp -field " + "Pool'|sed '1d'|grep -c ^.*$", + managed_system, vios_id) < 0) { + virReportOOMError(); + goto err; + } + + ret = phypExec(session, cmd, &exit_status, conn); + + if (exit_status < 0 || ret == NULL) + goto err; + + if (virStrToLong_i(ret, &char_ptr, 10, &nsp) == -1) + goto err;
NULL rather than char_ptr?
+ + VIR_FREE(cmd); + VIR_FREE(ret); + return nsp; + + err: + VIR_FREE(cmd); + VIR_FREE(ret); + return -1; +} + +int +phypListStoragePools(virConnectPtr conn, char **const pools, int npools)
Static function?
+{ + ConnectionData *connection_data = conn->networkPrivateData; + phyp_driverPtr phyp_driver = conn->privateData; + LIBSSH2_SESSION *session = connection_data->session; + char *managed_system = phyp_driver->managed_system; + int vios_id = phyp_driver->vios_id; + int exit_status = 0; + int got = 0; + int i; + char *cmd = NULL; + char *ret = NULL; + char *storage_pools = NULL; + char *char_ptr2 = NULL; + + if (virAsprintf + (&cmd, + "viosvrcmd -m %s --id %d -c 'lssp -field Pool'|sed '1d'", + managed_system, vios_id) < 0) { + virReportOOMError(); + goto err; + } + + ret = phypExec(session, cmd, &exit_status, conn); + + /* I need to parse the textual return in order to get the storage pools */ + if (exit_status < 0 || ret == NULL) + goto err; + else { + storage_pools = ret; + + while (got < npools) { + char_ptr2 = strchr(storage_pools, '\n'); + + if (char_ptr2) { + *char_ptr2 = '\0'; + if ((pools[got++] = strdup(storage_pools)) == NULL) { + virReportOOMError(); + goto err; + } + char_ptr2++; + storage_pools = char_ptr2; + } else + break; + } + } + + VIR_FREE(cmd); + VIR_FREE(ret); + return got; + + err: + for (i = 0; i < got; i++) + VIR_FREE(pools[i]); + VIR_FREE(cmd); + VIR_FREE(ret); + return -1; +} + +virDrvOpenStatus +phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED)
Static function?
+{ + return VIR_DRV_OPEN_SUCCESS; +} + +int +phypStorageClose(virConnectPtr conn ATTRIBUTE_UNUSED)
static function?
+{ + return 0; +} + int phypBuildLpar(virConnectPtr conn, virDomainDefPtr def) { @@ -2209,6 +2465,10 @@ waitsocket(int socket_fd, LIBSSH2_SESSION * session) int phypRegister(void) { - virRegisterDriver(&phypDriver); + if (virRegisterDriver(&phypDriver) < 0 ) + return -1; + if(virRegisterStorageDriver(&phypStorageDriver) < 0) + return -1; + return 0; } diff --git a/src/phyp/phyp_driver.h b/src/phyp/phyp_driver.h index f680994..edd0d6c 100644 --- a/src/phyp/phyp_driver.h +++ b/src/phyp/phyp_driver.h @@ -69,6 +69,32 @@ struct _phyp_driver { char *managed_system; };
+ +/* + * Common storage functions + * */ +int phypGetStoragePoolID(const char *sp_name, virConnectPtr conn); + +int phypGetStoragePoolUUID(unsigned char *sp_uuid, const char *sp_name, + virConnectPtr conn); + +virStoragePoolPtr phypSPLookupByName(virConnectPtr conn, const char *name); + +int phypNumOfStoragePools(virConnectPtr conn); + +int phypListStoragePools(virConnectPtr conn, char **const pools, + int npools); + +virDrvOpenStatus phypStorageOpen(virConnectPtr conn ATTRIBUTE_UNUSED, + virConnectAuthPtr auth ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED); + +int phypStorageClose(virConnectPtr conn);
If the don't need to be public then you can remove them from this file here. Stefan
+ +/* + * Common driver functions + * */ + int phypCheckSPFreeSapce(virConnectPtr conn, int required_size, char *sp);
int phypGetVIOSPartitionID(virConnectPtr conn);