[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [RFC 1/5]: Return exitstatus from virStorageBackendRunProgRegex



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 <clalance redhat com>

Index: src/storage_backend.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_backend.c,v
retrieving revision 1.14
diff -u -r1.14 storage_backend.c
--- a/src/storage_backend.c	6 Jun 2008 11:09:57 -0000	1.14
+++ b/src/storage_backend.c	12 Jun 2008 13:19:39 -0000
@@ -352,7 +352,8 @@
                               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 @@
         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: src/storage_backend.h
===================================================================
RCS file: /data/cvs/libvirt/src/storage_backend.h,v
retrieving revision 1.3
diff -u -r1.3 storage_backend.h
--- a/src/storage_backend.h	10 Apr 2008 16:53:29 -0000	1.3
+++ b/src/storage_backend.h	12 Jun 2008 13:19:39 -0000
@@ -133,7 +133,8 @@
                                   const char **regex,
                                   int *nvars,
                                   virStorageBackendListVolRegexFunc func,
-                                  void *data);
+                                  void *data,
+				  int *exitstatus);
 
 int virStorageBackendRunProgNul(virConnectPtr conn,
                                 virStoragePoolObjPtr pool,
Index: src/storage_backend_iscsi.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_backend_iscsi.c,v
retrieving revision 1.7
diff -u -r1.7 storage_backend_iscsi.c
--- a/src/storage_backend_iscsi.c	6 Jun 2008 11:09:57 -0000	1.7
+++ b/src/storage_backend_iscsi.c	12 Jun 2008 13:19:39 -0000
@@ -124,13 +124,18 @@
     };
     char *session = NULL;
 
+    /* Note that we ignore the exitstatus.  Older versions of iscsiadm tools
+     * returned and exit status of > 0, even if they succeeded.  We will just
+     * rely on whether session got filled in properlly.
+     */
     if (virStorageBackendRunProgRegex(conn, pool,
                                       prog,
                                       1,
                                       regexes,
                                       vars,
                                       virStorageBackendISCSIExtractSession,
-                                      &session) < 0)
+                                      &session,
+				      NULL) < 0)
         return NULL;
 
     if (session == NULL) {
@@ -373,7 +378,7 @@
                                          regexes,
                                          vars,
                                          virStorageBackendISCSIMakeLUN,
-                                         (void *)session);
+                                         (void *)session, NULL);
 }
 
 
Index: src/storage_backend_logical.c
===================================================================
RCS file: /data/cvs/libvirt/src/storage_backend_logical.c,v
retrieving revision 1.6
diff -u -r1.6 storage_backend_logical.c
--- a/src/storage_backend_logical.c	6 Jun 2008 11:09:57 -0000	1.6
+++ b/src/storage_backend_logical.c	12 Jun 2008 13:19:39 -0000
@@ -213,15 +213,30 @@
         "lv_name,uuid,devices,seg_size,vg_extent_size",
         pool->def->name, NULL
     };
+	int exitstatus;
 
-    return virStorageBackendRunProgRegex(conn,
-                                         pool,
-                                         prog,
-                                         1,
-                                         regexes,
-                                         vars,
-                                         virStorageBackendLogicalMakeVol,
-                                         vol);
+    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 +362,7 @@
         "--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,11 +378,22 @@
                                       regexes,
                                       vars,
                                       virStorageBackendLogicalRefreshPoolFunc,
-                                      NULL) < 0) {
+                                      NULL,
+									  &exitstatus) < 0) {
+		virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+							  _("vgs command failed"));
         virStoragePoolObjClearVols(pool);
         return -1;
     }
 
+	if (exitstatus != 0) {
+		virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+							  _("vgs command failed with exitstatus %d"),
+							  exitstatus);
+		virStoragePoolObjClearVols(pool);
+		return -1;
+	}
+
     return 0;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]