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

Eric Blake eblake at redhat.com
Fri Sep 30 21:18:52 UTC 2011


On 09/28/2011 02:08 PM, Serge E. Hallyn wrote:
> [ Thanks for the feedback, Eric.  Hopefully I correctly incorporated it
> in this version.  This version still tests fine with and without
> lvm.conf command_names=1 ]

Glad that it passed testing (as I had not tested my suggestions).

>
> 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.
>
> Changelog:
>    Sep 28: Use STRSKIP and make cmd_to_ignore arg const, as per Eric's
>            feedback.

I'll tweak the commit a bit (information like this is useful to the 
patch review, but less useful in 'git log' - so the best place to stick 
it is after the --- divider, so that 'git am' will know that it is not 
part of the official commit message).

> @@ -1460,13 +1460,20 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr pool,
>       }
>
>       while (fgets(line, sizeof(line), list) != NULL) {
> +        char *p = NULL;
>           /* Strip trailing newline */
>           int len = strlen(line);
>           if (len&&  line[len-1] == '\n')
>               line[len-1] = '\0';
>
> +        /* if cmd_to_ignore is specified, then ignore it */

I'll tweak this comment slightly to mention that we are skipping a 
prefix, if it is present, and not ignoring the entire command line.

> +++ 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) {

I'm not a big fan of in-function #define, especially if it's for a 
one-shot string literal.  I generally either float the #define up to the 
top of the file (out of the function), or in this case, inline the 
string constant into its lone usage point (we can refactor into a 
#define later, if we need to use the string more than once).

ACK and pushed with this squashed in:

diff --git i/src/storage/storage_backend.c w/src/storage/storage_backend.c
index dd7e36b..64c35c2 100644
--- i/src/storage/storage_backend.c
+++ w/src/storage/storage_backend.c
@@ -1400,7 +1400,7 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr 
pool,
                                const char **regex,
                                int *nvars,
                                virStorageBackendListVolRegexFunc func,
-                              void *data, const char *cmd_to_ignore)
+                              void *data, const char *prefix)
  {
      int fd = -1, err, ret = -1;
      FILE *list = NULL;
@@ -1466,9 +1466,9 @@ virStorageBackendRunProgRegex(virStoragePoolObjPtr 
pool,
          if (len && line[len-1] == '\n')
              line[len-1] = '\0';

-        /* if cmd_to_ignore is specified, then ignore it */
-        if (cmd_to_ignore)
-            p = STRSKIP(line, cmd_to_ignore);
+        /* ignore any command prefix */
+        if (prefix)
+            p = STRSKIP(line, prefix);
          if (!p)
              p = line;

diff --git i/src/storage/storage_backend_logical.c 
w/src/storage/storage_backend_logical.c
index 7923b71..589f486 100644
--- i/src/storage/storage_backend_logical.c
+++ w/src/storage/storage_backend_logical.c
@@ -205,14 +205,13 @@ 
virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
          pool->def->source.name, NULL
      };

-#define LVS_BASE "lvs"
      if (virStorageBackendRunProgRegex(pool,
                                        prog,
                                        1,
                                        regexes,
                                        vars,
                                        virStorageBackendLogicalMakeVol,
-                                      vol, LVS_BASE) < 0) {
+                                      vol, "lvs") < 0) {
          return -1;
      }

@@ -328,10 +327,9 @@ 
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, PVS_BASE) < 0)
+                                &sourceList, "pvs") < 0)
          return NULL;

      retval = virStoragePoolSourceListFormat(&sourceList);
@@ -498,7 +496,6 @@ virStorageBackendLogicalRefreshPool(virConnectPtr 
conn ATTRIBUTE_UNUSED,
          return -1;
      }

-#define VGS_BASE "vgs"
      /* Now get basic volgrp metadata */
      if (virStorageBackendRunProgRegex(pool,
                                        prog,
@@ -506,7 +503,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr 
conn ATTRIBUTE_UNUSED,
                                        regexes,
                                        vars,
 
virStorageBackendLogicalRefreshPoolFunc,
-                                      NULL, VGS_BASE) < 0) {
+                                      NULL, "vgs") < 0) {
          virStoragePoolObjClearVols(pool);
          return -1;
      }


-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list