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