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