summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlasdair G Kergon <agk@redhat.com>2015-07-20 15:48:59 +0100
committerAlasdair G Kergon <agk@redhat.com>2015-07-20 15:48:59 +0100
commit500fd8b9bfc6f15d2417c829bce33ea4768261b8 (patch)
treee697a2a1672f5662920a35d389170c1ec254db6e
parentb4be988732e909d34ae7b4868bf30cf44c087518 (diff)
downloadlvm2-500fd8b9bfc6f15d2417c829bce33ea4768261b8.tar.gz
log: Add DM_ABORT_ON_INTERNAL_ERRORS lvm override.
Recognise DM_ABORT_ON_INTERNAL_ERRORS in the lvm logging function as well as the default dm function it replaces.
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/log/log.c21
2 files changed, 19 insertions, 3 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 596a92fb6..3cd9111cf 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.126 -
================================
+ Recognise DM_ABORT_ON_INTERNAL_ERRORS env var override in lvm logging fn.
Fix alloc segfault when extending LV with fewer stripes than in first seg.
Fix handling of cache policy name.
Set cache policy before with the first lvm2 cache pool metadata commit.
diff --git a/lib/log/log.c b/lib/log/log.c
index a439d1da3..992909000 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -36,7 +36,7 @@ static int _indent = 1;
static int _log_suppress = 0;
static char _msg_prefix[30] = " ";
static int _already_logging = 0;
-static int _abort_on_internal_errors = 0;
+static int _abort_on_internal_errors_config = 0;
static lvm2_log_fn_t _lvm2_log_fn = NULL;
@@ -218,9 +218,10 @@ void init_indent(int indent)
_indent = indent;
}
+/* If present, environment setting will override this. */
void init_abort_on_internal_errors(int fatal)
{
- _abort_on_internal_errors = fatal;
+ _abort_on_internal_errors_config = fatal;
}
void reset_lvm_errno(int store_errmsg)
@@ -277,10 +278,24 @@ void print_log(int level, const char *file, int line, int dm_errno_or_class,
size_t msglen;
const char *indent_spaces = "";
FILE *stream;
+ static int _abort_on_internal_errors_env_present = -1;
+ static int _abort_on_internal_errors_env = 0;
+ char *env_str;
level &= ~(_LOG_STDERR|_LOG_ONCE);
- if (_abort_on_internal_errors &&
+ if (_abort_on_internal_errors_env_present < 0) {
+ if ((env_str = getenv("DM_ABORT_ON_INTERNAL_ERRORS"))) {
+ _abort_on_internal_errors_env_present = 1;
+ /* Set when env DM_ABORT_ON_INTERNAL_ERRORS is not "0" */
+ _abort_on_internal_errors_env = strcmp(env_str, "0");
+ } else
+ _abort_on_internal_errors_env_present = 0;
+ }
+
+ /* Use value from environment if present, otherwise use value from config. */
+ if (((_abort_on_internal_errors_env_present && _abort_on_internal_errors_env) ||
+ (!_abort_on_internal_errors_env_present && _abort_on_internal_errors_config)) &&
!strncmp(format, INTERNAL_ERROR, sizeof(INTERNAL_ERROR) - 1)) {
fatal_internal_error = 1;
/* Internal errors triggering abort cannot be suppressed. */