[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[libvirt] [PATCH 1/5]: Return exitstatus from virStorageBackendRunProgRegex
- From: Chris Lalancette <clalance redhat com>
- To: libvir-list redhat com
- Subject: [libvirt] [PATCH 1/5]: Return exitstatus from virStorageBackendRunProgRegex
- Date: Mon, 16 Jun 2008 15:52:31 +0200
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.
Changes since last time:
1) Fix up whitespace damage
Signed-off-by: Chris Lalancette <clalance redhat com>
diff -urp libvirt.orig/src/storage_backend.c libvirt.runprogregex/src/storage_backend.c
--- libvirt.orig/src/storage_backend.c 2008-06-06 13:09:57.000000000 +0200
+++ libvirt.runprogregex/src/storage_backend.c 2008-06-16 14:22:12.000000000 +0200
@@ -352,7 +352,8 @@ virStorageBackendRunProgRegex(virConnect
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(virConnect
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 -urp libvirt.orig/src/storage_backend.h libvirt.runprogregex/src/storage_backend.h
--- libvirt.orig/src/storage_backend.h 2008-04-10 18:53:29.000000000 +0200
+++ libvirt.runprogregex/src/storage_backend.h 2008-06-16 14:22:46.000000000 +0200
@@ -133,7 +133,8 @@ int virStorageBackendRunProgRegex(virCon
const char **regex,
int *nvars,
virStorageBackendListVolRegexFunc func,
- void *data);
+ void *data,
+ int *exitstatus);
int virStorageBackendRunProgNul(virConnectPtr conn,
virStoragePoolObjPtr pool,
diff -urp libvirt.orig/src/storage_backend_iscsi.c libvirt.runprogregex/src/storage_backend_iscsi.c
--- libvirt.orig/src/storage_backend_iscsi.c 2008-06-06 13:09:57.000000000 +0200
+++ libvirt.runprogregex/src/storage_backend_iscsi.c 2008-06-16 14:24:40.000000000 +0200
@@ -124,13 +124,18 @@ virStorageBackendISCSISession(virConnect
};
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(virConnec
regexes,
vars,
virStorageBackendISCSIMakeLUN,
- (void *)session);
+ (void *)session, NULL);
}
diff -urp libvirt.orig/src/storage_backend_logical.c libvirt.runprogregex/src/storage_backend_logical.c
--- libvirt.orig/src/storage_backend_logical.c 2008-06-06 13:09:57.000000000 +0200
+++ libvirt.runprogregex/src/storage_backend_logical.c 2008-06-16 14:26:09.000000000 +0200
@@ -214,14 +214,30 @@ virStorageBackendLogicalFindLVs(virConne
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(virC
"--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(virC
regexes,
vars,
virStorageBackendLogicalRefreshPoolFunc,
- NULL) < 0) {
+ NULL,
+ &exitstatus) < 0) {
+ virStoragePoolObjClearVols(pool);
+ return -1;
+ }
+
+ if (exitstatus != 0) {
virStoragePoolObjClearVols(pool);
return -1;
}
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]