]> xenbits.xensource.com Git - libvirt.git/commitdiff
This patch changes things around so that virStorageBackendRunProgRegex() does
authorChris Lalancette <clalance@redhat.com>
Tue, 17 Jun 2008 12:45:24 +0000 (12:45 +0000)
committerChris Lalancette <clalance@redhat.com>
Tue, 17 Jun 2008 12:45:24 +0000 (12:45 +0000)
*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 <clalance@redhat.com>
src/storage_backend.c
src/storage_backend.h
src/storage_backend_iscsi.c
src/storage_backend_logical.c

index 9052a0b0cd3bca6b50860812fa855faaa8905596..ffef6feada4cd8b9730b752aea42d2a335b50ff9 100644 (file)
@@ -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"));
index 0ec0d905c81c1cf9ee8b7885fe31ca46e8fe8db6..44c691e1c0071851d426f1463288c923fbbca3bf 100644 (file)
@@ -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,
index e168adcb86973fa3e9a7d02ac974aa94bb506632..96bb92774a93eddab50603959c5e2274746e0975 100644 (file)
@@ -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);
 }
 
 
index 916c23c7abe6dfa9ac1978ebc9c529632e9416f7..9a0c27fecf1407688e4851c154bad01c9771b5ca 100644 (file)
@@ -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;
     }