[libvirt] [PATCH 1/1] [RFC] lvm storage backend: handle command_names=1 in lvm.conf

Serge Hallyn serge.hallyn at canonical.com
Mon Sep 26 13:56:21 UTC 2011


Quoting Serge E. Hallyn (serge.hallyn at canonical.com):
> If the regexes supported (?:pvs)?, then we could handle this by
> optionally matching but not returning the initial command name.  But it
> doesn't.  So add a new char* argument to
> virStorageBackendRunProgRegex().  If that argument is NULL then we act
> as usual.  Otherwise, if the string at that argument is found at the
> start of a returned line, we drop that before running the regex.
> 
> With this patch, virt-manager shows me lvs with command_names 1 or 0.
> 
> The definitions of PVS_BASE etc may want to be moved into the configure
> scripts (though given how PVS is found, IIUC that could only happen if
> pvs was a link to pvs_real), but in any case no sense dealing with that
> until we're sure this is an ok way to handle it.
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at canonical.com>

Any comments on this?  Is it deemed JDFDT?

> ---
>  src/storage/storage_backend.c         |   14 ++++++++++----
>  src/storage/storage_backend.h         |    2 +-
>  src/storage/storage_backend_fs.c      |    2 +-
>  src/storage/storage_backend_iscsi.c   |    4 ++--
>  src/storage/storage_backend_logical.c |    9 ++++++---
>  5 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index d125504..7a352da 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -1400,7 +1400,7 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
>                                const char **regex,
>                                int *nvars,
>                                virStorageBackendListVolRegexFunc func,
> -                              void *data)
> +                              void *data, char *cmd_to_ignore)
>  {
>      int fd = -1, err, ret = -1;
>      FILE *list = NULL;
> @@ -1460,13 +1460,19 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
>      }
>  
>      while (fgets(line, sizeof(line), list) != NULL) {
> +        char *p;
>          /* Strip trailing newline */
>          int len = strlen(line);
>          if (len && line[len-1] == '\n')
>              line[len-1] = '\0';
>  
> +        p = line;
> +        /* if cmd_to_ignore is specified, then ignore it */
> +        if (strncmp(line, cmd_to_ignore, strlen(cmd_to_ignore)) == 0)
> +            p += strlen(cmd_to_ignore);
> +
>          for (i = 0 ; i <= maxReg && i < nregex ; i++) {
> -            if (regexec(&reg[i], line, nvars[i]+1, vars, 0) == 0) {
> +            if (regexec(&reg[i], p, nvars[i]+1, vars, 0) == 0) {
>                  maxReg++;
>  
>                  if (i == 0)
> @@ -1475,9 +1481,9 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
>                  /* NULL terminate each captured group in the line */
>                  for (j = 0 ; j < nvars[i] ; j++) {
>                      /* NB vars[0] is the full pattern, so we offset j by 1 */
> -                    line[vars[j+1].rm_eo] = '\0';
> +                    p[vars[j+1].rm_eo] = '\0';
>                      if ((groups[ngroup++] =
> -                         strdup(line + vars[j+1].rm_so)) == NULL) {
> +                         strdup(p + vars[j+1].rm_so)) == NULL) {
>                          virReportOOMError();
>                          goto cleanup;
>                      }
> diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
> index 67ac32c..aa467f5 100644
> --- a/src/storage/storage_backend.h
> +++ b/src/storage/storage_backend.h
> @@ -140,7 +140,7 @@ int virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
>                                    const char **regex,
>                                    int *nvars,
>                                    virStorageBackendListVolRegexFunc func,
> -                                  void *data);
> +                                  void *data, char *cmd_to_ignore);
>  
>  int virStorageBackendRunProgNul(virStoragePoolObjPtr pool,
>                                  const char **prog,
> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index 02c4c17..a98db4b 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -266,7 +266,7 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE
>  
>      if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
>                              virStorageBackendFileSystemNetFindPoolSourcesFunc,
> -                            &state) < 0)
> +                            &state, NULL) < 0)
>          goto cleanup;
>  
>      retval = virStoragePoolSourceListFormat(&state.list);
> diff --git a/src/storage/storage_backend_iscsi.c b/src/storage/storage_backend_iscsi.c
> index 346e698..99e69c9 100644
> --- a/src/storage/storage_backend_iscsi.c
> +++ b/src/storage/storage_backend_iscsi.c
> @@ -160,7 +160,7 @@ virStorageBackendISCSISession(virStoragePoolObjPtr pool,
>                                        regexes,
>                                        vars,
>                                        virStorageBackendISCSIExtractSession,
> -                                      &session) < 0)
> +                                      &session, NULL) < 0)
>          return NULL;
>  
>      if (session == NULL &&
> @@ -517,7 +517,7 @@ virStorageBackendISCSIScanTargets(const char *portal,
>                                        regexes,
>                                        vars,
>                                        virStorageBackendISCSIGetTargets,
> -                                      &list) < 0) {
> +                                      &list, NULL) < 0) {
>          return -1;
>      }
>  
> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
> index 4f42047..7fac7b1 100644
> --- a/src/storage/storage_backend_logical.c
> +++ b/src/storage/storage_backend_logical.c
> @@ -205,13 +205,14 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
>          pool->def->source.name, NULL
>      };
>  
> +#define LVS_BASE "lvs"
>      if (virStorageBackendRunProgRegex(pool,
>                                        prog,
>                                        1,
>                                        regexes,
>                                        vars,
>                                        virStorageBackendLogicalMakeVol,
> -                                      vol) < 0) {
> +                                      vol, LVS_BASE) < 0) {
>          return -1;
>      }
>  
> @@ -327,9 +328,10 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSED,
>      memset(&sourceList, 0, sizeof(sourceList));
>      sourceList.type = VIR_STORAGE_POOL_LOGICAL;
>  
> +#define PVS_BASE "pvs"
>      if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
>                                  virStorageBackendLogicalFindPoolSourcesFunc,
> -                                &sourceList) < 0)
> +                                &sourceList, PVS_BASE) < 0)
>          return NULL;
>  
>      retval = virStoragePoolSourceListFormat(&sourceList);
> @@ -496,6 +498,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>          return -1;
>      }
>  
> +#define VGS_BASE "vgs"
>      /* Now get basic volgrp metadata */
>      if (virStorageBackendRunProgRegex(pool,
>                                        prog,
> @@ -503,7 +506,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
>                                        regexes,
>                                        vars,
>                                        virStorageBackendLogicalRefreshPoolFunc,
> -                                      NULL) < 0) {
> +                                      NULL, VGS_BASE) < 0) {
>          virStoragePoolObjClearVols(pool);
>          return -1;
>      }
> -- 
> 1.7.5.4
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list