From a75a612ad5593d95cc452eaed65b8267aca3e601 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Tue, 17 Jun 2008 12:45:24 +0000 Subject: [PATCH] This patch changes things around so that virStorageBackendRunProgRegex() does *not* virStorageReportError() if the fork()/exec() process it spawned returned a != 0 exit code. Rather, it returns the exitcode in this case, and it is up to the higher level to determine whether this is a fatal error or not. The use case for this change is in the iSCSI stuff; older versions of iscsiadm tools would return a failure when getting the session number, despite the command succeeding. Signed-off-by: Chris Lalancette --- src/storage_backend.c | 11 ++++------ src/storage_backend.h | 3 ++- src/storage_backend_iscsi.c | 9 ++++++-- src/storage_backend_logical.c | 41 +++++++++++++++++++++++++++-------- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/storage_backend.c b/src/storage_backend.c index 9052a0b0cd..ffef6feada 100644 --- a/src/storage_backend.c +++ b/src/storage_backend.c @@ -352,7 +352,8 @@ virStorageBackendRunProgRegex(virConnectPtr conn, const char **regex, int *nvars, virStorageBackendListVolRegexFunc func, - void *data) + void *data, + int *outexit) { int child = 0, fd = -1, exitstatus, err, failed = 1; FILE *list = NULL; @@ -487,12 +488,8 @@ virStorageBackendRunProgRegex(virConnectPtr conn, return -1; } else { if (WIFEXITED(exitstatus)) { - if (WEXITSTATUS(exitstatus) != 0) { - virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, - _("non-zero exit status from command %d"), - WEXITSTATUS(exitstatus)); - return -1; - } + if (outexit != NULL) + *outexit = WEXITSTATUS(exitstatus); } else { virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("command did not exit cleanly")); diff --git a/src/storage_backend.h b/src/storage_backend.h index 0ec0d905c8..44c691e1c0 100644 --- a/src/storage_backend.h +++ b/src/storage_backend.h @@ -133,7 +133,8 @@ int virStorageBackendRunProgRegex(virConnectPtr conn, const char **regex, int *nvars, virStorageBackendListVolRegexFunc func, - void *data); + void *data, + int *exitstatus); int virStorageBackendRunProgNul(virConnectPtr conn, virStoragePoolObjPtr pool, diff --git a/src/storage_backend_iscsi.c b/src/storage_backend_iscsi.c index e168adcb86..96bb92774a 100644 --- a/src/storage_backend_iscsi.c +++ b/src/storage_backend_iscsi.c @@ -124,13 +124,18 @@ virStorageBackendISCSISession(virConnectPtr conn, }; char *session = NULL; + /* Note that we ignore the exitstatus. Older versions of iscsiadm tools + * returned an exit status of > 0, even if they succeeded. We will just + * rely on whether session got filled in properly. + */ if (virStorageBackendRunProgRegex(conn, pool, prog, 1, regexes, vars, virStorageBackendISCSIExtractSession, - &session) < 0) + &session, + NULL) < 0) return NULL; if (session == NULL) { @@ -373,7 +378,7 @@ virStorageBackendISCSIFindLUNs(virConnectPtr conn, regexes, vars, virStorageBackendISCSIMakeLUN, - (void *)session); + (void *)session, NULL); } diff --git a/src/storage_backend_logical.c b/src/storage_backend_logical.c index 916c23c7ab..9a0c27fecf 100644 --- a/src/storage_backend_logical.c +++ b/src/storage_backend_logical.c @@ -214,14 +214,30 @@ virStorageBackendLogicalFindLVs(virConnectPtr conn, pool->def->name, NULL }; - return virStorageBackendRunProgRegex(conn, - pool, - prog, - 1, - regexes, - vars, - virStorageBackendLogicalMakeVol, - vol); + int exitstatus; + + if (virStorageBackendRunProgRegex(conn, + pool, + prog, + 1, + regexes, + vars, + virStorageBackendLogicalMakeVol, + vol, + &exitstatus) < 0) { + virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("lvs command failed")); + return -1; + } + + if (exitstatus != 0) { + virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, + _("lvs command failed with exitstatus %d"), + exitstatus); + return -1; + } + + return 0; } static int @@ -347,6 +363,7 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn, "--nosuffix", "--options", "vg_size,vg_free", pool->def->name, NULL }; + int exitstatus; /* Get list of all logical volumes */ if (virStorageBackendLogicalFindLVs(conn, pool, NULL) < 0) { @@ -362,7 +379,13 @@ virStorageBackendLogicalRefreshPool(virConnectPtr conn, regexes, vars, virStorageBackendLogicalRefreshPoolFunc, - NULL) < 0) { + NULL, + &exitstatus) < 0) { + virStoragePoolObjClearVols(pool); + return -1; + } + + if (exitstatus != 0) { virStoragePoolObjClearVols(pool); return -1; } -- 2.39.5