[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(®[i], line, nvars[i]+1, vars, 0) == 0) {
> + if (regexec(®[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