[libvirt] [PATCH 3/4] storage: Introduce virStoragePoolObjListSearch

Erik Skultety eskultet at redhat.com
Thu Nov 23 14:00:44 UTC 2017


On Thu, Nov 16, 2017 at 11:58:04AM -0500, John Ferlan wrote:
> Create an API to search through the storage pool objects looking for
> a specific truism from a callback API in order to return the specific
> storage pool object that is desired.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---

As for the searcher that is a copy-paste of the 'for each iterator' with a
single difference, I assume the list is going to be converted to a hash table
further on, right?

...

>
> +
> +static bool
> +storagePoolLookupByTargetPathCallback(virStoragePoolObjPtr obj,
> +                                      const void *opaque)
> +{
> +    const char *path = opaque;
> +    virStoragePoolDefPtr def;
> +
> +    if (!virStoragePoolObjIsActive(obj))
> +        return false;
> +
> +    def = virStoragePoolObjGetDef(obj);
> +    return STREQ(path, def->target.path);
> +}
> +
> +
>  virStoragePoolPtr
>  storagePoolLookupByTargetPath(virConnectPtr conn,
>                                const char *path)
>  {
> -    size_t i;
> +    virStoragePoolObjPtr obj;
> +    virStoragePoolDefPtr def;
>      virStoragePoolPtr pool = NULL;
>      char *cleanpath;
>
>      cleanpath = virFileSanitizePath(path);
>      if (!cleanpath)
>          return NULL;
> +    VIR_FREE(cleanpath);

Existing prior your patch, but I'm clearly missing the point of running
virFileSanitizePath here, since it can only return NULL on a failed allocation
and the way we're treating it now is "it either failed or some sanitization
may or may not have happened" - my question therefore is, why don't we care
about the result of sanitizing the path but we have to run it anyway?

>
>      storageDriverLock();
> -    for (i = 0; i < driver->pools.count && !pool; i++) {
> -        virStoragePoolObjPtr obj = driver->pools.objs[i];
> -        virStoragePoolDefPtr def;
> -
> -        virStoragePoolObjLock(obj);
> +    if ((obj == virStoragePoolObjListSearch(&driver->pools,
> +                                            storagePoolLookupByTargetPathCallback,
> +                                            path))) {
>          def = virStoragePoolObjGetDef(obj);
> -
> -        if (!virStoragePoolObjIsActive(obj)) {
> -            virStoragePoolObjEndAPI(&obj);
> -            continue;
> -        }
> -
> -        if (STREQ(path, def->target.path))
> -            pool = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL);
> -
> +        pool = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL);
>          virStoragePoolObjEndAPI(&obj);
>      }
>      storageDriverUnlock();
> @@ -1672,7 +1689,6 @@ storagePoolLookupByTargetPath(virConnectPtr conn,
>                         path);
>      }
>
> -    VIR_FREE(cleanpath);
>      return pool;
>  }
>

Reviewed-by: Erik Skultety <eskultet at redhat.com>




More information about the libvir-list mailing list