<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>