master - coverity: validate descriptor
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=26c58027fb9df068c92...
Commit: 26c58027fb9df068c927abe61336ff6364fe3d0e
Parent: f331eb1c0d060529a3b5e6517c8ac423e21796d3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 13:53:12 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:33:58 2018 +0100
coverity: validate descriptor
Since this function is called with 'fd == -1', but Coverity can't see
this path can't be visited with this argument, add explicit check for
valid descriptor.
---
daemons/clvmd/clvmd.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c
index e15a40a..829c5e5 100644
--- a/daemons/clvmd/clvmd.c
+++ b/daemons/clvmd/clvmd.c
@@ -1999,6 +1999,9 @@ static int send_message(void *buf, int msglen, const char *csid, int fd,
return clops->cluster_send_message(buf, msglen, csid, errtext);
}
+ if (fd < 0)
+ return 0;
+
/* Make sure it all goes */
for (ptr = 0; ptr < msglen;) {
if ((len = write(fd, (char*)buf + ptr, msglen - ptr)) <= 0) {
6 years, 1 month
master - coverity: ensure lock_type is not NULL
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f331eb1c0d060529a3b...
Commit: f331eb1c0d060529a3b5e6517c8ac423e21796d3
Parent: fd6661dfcf7568d32a127e63b0d6c95c010688fb
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 14:16:09 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:33:58 2018 +0100
coverity: ensure lock_type is not NULL
---
tools/vgchange.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/vgchange.c b/tools/vgchange.c
index 6d739fe..7cfaab6 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -955,7 +955,7 @@ static int _vgchange_locktype(struct cmd_context *cmd, struct volume_group *vg)
vg->lock_type = "none";
}
- if (!strcmp(vg->lock_type, lock_type)) {
+ if (lock_type && !strcmp(vg->lock_type, lock_type)) {
log_warn("New lock type %s matches the current lock type %s.",
lock_type, vg->lock_type);
return 1;
@@ -1180,7 +1180,7 @@ int vgchange_locktype_cmd(struct cmd_context *cmd, int argc, char **argv)
* just return success when they see the disable flag set.
*/
if (lockopt && !strcmp(lockopt, "force")) {
- if (strcmp(lock_type, "none")) {
+ if (lock_type && strcmp(lock_type, "none")) {
log_error("Lock type can only be forced to \"none\" for recovery.");
return 0;
}
6 years, 1 month
master - coverity: add missing error check for str_list_add
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=fd6661dfcf7568d32a1...
Commit: fd6661dfcf7568d32a127e63b0d6c95c010688fb
Parent: d7273822757d6ccc7d4178f01c96fc3be52702a3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 14:15:11 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:33:58 2018 +0100
coverity: add missing error check for str_list_add
Validate success.
---
tools/toollib.c | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/tools/toollib.c b/tools/toollib.c
index eab6223..3f27a7a 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -3088,7 +3088,11 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
if (lvargs_supplied && str_list_match_item(arg_lvnames, lvl->lv->name)) {
/* Remove LV from list of unprocessed LV names */
str_list_del(arg_lvnames, lvl->lv->name);
- str_list_add(cmd->mem, &found_arg_lvnames, lvl->lv->name);
+ if (!str_list_add(cmd->mem, &found_arg_lvnames, lvl->lv->name)) {
+ log_error("strlist allocation failed.");
+ ret_max = ECMD_FAILED;
+ goto out;
+ }
process_lv = 1;
}
6 years, 1 month
master - lvconvert: accept striped LV as snapshot COW LV
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d7273822757d6ccc7d4...
Commit: d7273822757d6ccc7d4178f01c96fc3be52702a3
Parent: 67fbe980a710a790d6d1ea7f9cfaf9d8c6e50448
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 14:01:09 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:33:58 2018 +0100
lvconvert: accept striped LV as snapshot COW LV
Restore back acceptance of striped LV to be valid COW LV.
---
WHATS_NEW | 1 +
man/lvconvert.8_pregen | 4 ++--
tools/command-lines.in | 4 ++--
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5711f41..995b389 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.178 -
=====================================
+ Again accept striped LV as COW LV with lvconvert -s (2.02.169).
Fix raid target version testing for supported features.
Allow activation of pools when thin/cache_check tool is missing.
Remove RaidLV on creation failure when rmeta devices can't be activated.
diff --git a/man/lvconvert.8_pregen b/man/lvconvert.8_pregen
index 5171d6a..e0e38b9 100644
--- a/man/lvconvert.8_pregen
+++ b/man/lvconvert.8_pregen
@@ -760,7 +760,7 @@ Combine a former COW snapshot (second arg) with a former
origin LV (first arg) to reverse a splitsnapshot command.
.br
.P
-\fBlvconvert\fP \fB--type\fP \fBsnapshot\fP \fILV\fP \fILV\fP\fI_linear\fP
+\fBlvconvert\fP \fB--type\fP \fBsnapshot\fP \fILV\fP \fILV\fP\fI_linear_striped\fP
.br
.RS 4
.ad l
@@ -1694,7 +1694,7 @@ Combine a former COW snapshot (second arg) with a former
origin LV (first arg) to reverse a splitsnapshot command.
.br
.P
-\fBlvconvert\fP \fB-s\fP|\fB--snapshot\fP \fILV\fP \fILV\fP\fI_linear\fP
+\fBlvconvert\fP \fB-s\fP|\fB--snapshot\fP \fILV\fP \fILV\fP\fI_linear_striped\fP
.br
.RS 4
.ad l
diff --git a/tools/command-lines.in b/tools/command-lines.in
index a1776ce..2a6882e 100644
--- a/tools/command-lines.in
+++ b/tools/command-lines.in
@@ -626,7 +626,7 @@ FLAGS: SECONDARY_SYNTAX
# will not be checked.
# alternate form of lvconvert --snapshot
-lvconvert --type snapshot LV LV_linear
+lvconvert --type snapshot LV LV_linear_striped
OO: --snapshot, --chunksize SizeKB, --zero Bool, OO_LVCONVERT
ID: lvconvert_combine_split_snapshot
DESC: Combine a former COW snapshot (second arg) with a former
@@ -634,7 +634,7 @@ DESC: origin LV (first arg) to reverse a splitsnapshot command.
RULE: all not lv_is_locked lv_is_pvmove
RULE: all and lv_is_visible
-lvconvert --snapshot LV LV_linear
+lvconvert --snapshot LV LV_linear_striped
OO: --type snapshot, --chunksize SizeKB, --zero Bool, OO_LVCONVERT
ID: lvconvert_combine_split_snapshot
DESC: Combine a former COW snapshot (second arg) with a former
6 years, 1 month
master - raid: fix version check of target
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=67fbe980a710a790d6d...
Commit: 67fbe980a710a790d6d1ea7f9cfaf9d8c6e50448
Parent: 689af32313ac120dd67a16d73e78ede5295e308c
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 21:44:53 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:30:14 2018 +0100
raid: fix version check of target
Comparision missed to check patch level for matching minor version.
Howerver since all checked patchlevels were 0 - the fix doesn't change result.
---
WHATS_NEW | 1 +
lib/raid/raid.c | 2 +-
2 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index a974a6c..5711f41 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.178 -
=====================================
+ Fix raid target version testing for supported features.
Allow activation of pools when thin/cache_check tool is missing.
Remove RaidLV on creation failure when rmeta devices can't be activated.
Add prioritized_section() to restore cookie boundaries (2.02.177).
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 269a30c..e926ae1 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -464,7 +464,7 @@ struct raid_feature {
static int _check_feature(const struct raid_feature *feature, uint32_t maj, uint32_t min, uint32_t patchlevel)
{
return (maj > feature->maj) ||
- (maj == feature->maj && min >= feature->min) ||
+ (maj == feature->maj && min > feature->min) ||
(maj == feature->maj && min == feature->min && patchlevel >= feature->patchlevel);
}
6 years, 1 month
master - pools: skip checks when tools are missing
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=689af32313ac120dd67...
Commit: 689af32313ac120dd67a16d73e78ede5295e308c
Parent: d68d71013fb261c87f1d3a26ebf098644055c6d1
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Sat Mar 17 21:50:03 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Sat Mar 17 23:29:11 2018 +0100
pools: skip checks when tools are missing
If the tools for checking thin_pool or cache metadata are missing,
issue rather just a WARNING, but let the operation of activation
continue.
This has the advantage, the if user is missing those tools,
but he already started to use thinpool or cacheing, he can
access these volumes with a WARNING.
Also if the user is using too old tools i.e. for CacheV2 format
dmpd tool 0.7 is required - provide informative WARNING and
skip failure from older tool version which can't understand
new format V2.
---
WHATS_NEW | 1 +
lib/activate/dev_manager.c | 64 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 2ec7f7e..a974a6c 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.178 -
=====================================
+ Allow activation of pools when thin/cache_check tool is missing.
Remove RaidLV on creation failure when rmeta devices can't be activated.
Add prioritized_section() to restore cookie boundaries (2.02.177).
Enhance error messages when read error happens.
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index ae3db80..32c737c 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1983,9 +1983,56 @@ struct pool_cb_data {
int skip_zero; /* to skip zeroed device header (check first 64B) */
int exec; /* which binary to call */
int opts;
+ struct {
+ unsigned maj;
+ unsigned min;
+ unsigned patch;
+ } version;
const char *global;
};
+/*
+ * Simple version of check function calling 'tool -V'
+ *
+ * Returns 1 if the tool's version is equal or better to given.
+ * Otherwise it returns 0.
+ */
+static int _check_tool_version(struct cmd_context *cmd, const char *tool,
+ unsigned maj, unsigned min, unsigned patch)
+{
+ const char *argv[] = { tool, "-V", NULL };
+ struct pipe_data pdata;
+ FILE *f;
+ char buf[128] = { 0 };
+ char *nl;
+ unsigned v_maj, v_min, v_patch;
+ int ret = 0;
+
+ if (!(f = pipe_open(cmd, argv, 0, &pdata))) {
+ log_warn("WARNING: Cannot read output from %s.", argv[0]);
+ } else {
+ if (fgets(buf, sizeof(buf) - 1, f) &&
+ (sscanf(buf, "%u.%u.%u", &v_maj, &v_min, &v_patch) == 3)) {
+ if ((v_maj > maj) ||
+ ((v_maj == maj) &&
+ ((v_min > min) ||
+ (v_min == min && v_patch >= patch))))
+ ret = 1;
+
+ if ((nl = strchr(buf, '\n')))
+ nl[0] = 0; /* cut newline away */
+
+ log_verbose("Found version of %s %s is %s then requested %u.%u.%u.",
+ argv[0], buf, ret ? "better" : "older", maj, min, patch);
+ } else
+ log_warn("WARNING: Cannot parse output '%s' from %s.", buf, argv[0]);
+
+ (void) pipe_close(&pdata);
+ }
+
+ return ret;
+}
+
static int _pool_callback(struct dm_tree_node *node,
dm_node_callback_t type, void *cb_data)
{
@@ -2061,6 +2108,19 @@ static int _pool_callback(struct dm_tree_node *node,
if (!(ret = exec_cmd(pool_lv->vg->cmd, (const char * const *)argv,
&status, 0))) {
+ if (status == ENOENT) {
+ log_warn("WARNING: Check is skipped, please install recomended missing binary %s!",
+ argv[0]);
+ return 1;
+ }
+
+ if ((data->version.maj || data->version.min || data->version.patch) &&
+ !_check_tool_version(pool_lv->vg->cmd, argv[0],
+ data->version.maj, data->version.min, data->version.patch)) {
+ log_warn("WARNING: Check is skipped, please upgrade installed version of %s!",
+ argv[0]);
+ return 1;
+ }
switch (type) {
case DM_NODE_CALLBACK_PRELOADED:
log_err_once("Check of pool %s failed (status:%d). "
@@ -2118,6 +2178,10 @@ static int _pool_register_callback(struct dev_manager *dm,
data->exec = global_cache_check_executable_CFG;
data->opts = global_cache_check_options_CFG;
data->global = "cache";
+ if (first_seg(first_seg(lv)->pool_lv)->cache_metadata_format > 1) {
+ data->version.maj = 0;
+ data->version.min = 7;
+ }
} else {
log_error(INTERNAL_ERROR "Registering unsupported pool callback.");
return 0;
6 years, 1 month
master - lvcreate: remove RaidLV on creation failure
by Heinz Mauelshagen
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d68d71013fb261c87f1...
Commit: d68d71013fb261c87f1d3a26ebf098644055c6d1
Parent: 9553dc77611e787999923a4cfeb223360ce00672
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Fri Mar 16 15:47:12 2018 +0100
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Fri Mar 16 15:57:53 2018 +0100
lvcreate: remove RaidLV on creation failure
In case a newly created RaidLV is blacklisted using config
\"activation { volume list = [ ... ] }\" (i.e. its SubLVs stay inactive),
the metadata SubLVs can't get wiped thus failing the creation.
As a result, the RaidLV together with its SubLVs
is left behind in an inconsistent state.
Fix by removing the RaidLV and provide a hint about volume_list reasoning.
Resolves: rhbz1161347
---
WHATS_NEW | 1 +
lib/metadata/lv_manip.c | 11 +++++++++--
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index da5f5f4..2ec7f7e 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.178 -
=====================================
+ Remove RaidLV on creation failure when rmeta devices can't be activated.
Add prioritized_section() to restore cookie boundaries (2.02.177).
Enhance error messages when read error happens.
Enhance mirror log initialization for old mirror target.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 9566f3e..da5e355 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -4100,9 +4100,16 @@ static int _lv_extend_layered_lv(struct alloc_handle *ah,
str_list_wipe(&meta_lv->tags);
}
- if (fail)
+ if (fail) {
/* Fail, after trying to deactivate all we could */
+ struct volume_group *vg = lv->vg;
+
+ if (!lv_remove(lv))
+ log_error("Failed to remove LV");
+ else if (!vg_write(vg) || !vg_commit(vg))
+ log_error("Failed to commit VG %s", vg->name);
return_0;
+ }
}
for (s = 0; s < seg->area_count; s++)
@@ -7155,7 +7162,7 @@ int wipe_lv(struct logical_volume *lv, struct wipe_params wp)
}
if (!lv_is_active_locally(lv)) {
- log_error("Volume \"%s/%s\" is not active locally.",
+ log_error("Volume \"%s/%s\" is not active locally (volume_list activation filter?).",
lv->vg->name, lv->name);
return 0;
}
6 years, 1 month
master - activation: separate prioritized counter
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=9553dc77611e7879999...
Commit: 9553dc77611e787999923a4cfeb223360ce00672
Parent: f6f8f0c7fda823b1d7261472a6d724118ed19007
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Mar 15 12:30:45 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Mar 15 12:30:45 2018 +0100
activation: separate prioritized counter
While prioritized_section() based on raised priority works
nicely for standard lvm comman - separate counter is actually needed
when it's used in daemons like clvmd/dmeventd where priority
stays raised all the time.
---
lib/mm/memlock.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/lib/mm/memlock.c b/lib/mm/memlock.c
index b55cc97..b15058e 100644
--- a/lib/mm/memlock.c
+++ b/lib/mm/memlock.c
@@ -87,6 +87,7 @@ static void *_malloc_mem = NULL;
static int _mem_locked = 0;
static int _priority_raised = 0;
static int _critical_section = 0;
+static int _prioritized_section = 0;
static int _memlock_count_daemon = 0;
static int _priority;
static int _default_priority;
@@ -618,6 +619,7 @@ void critical_section_inc(struct cmd_context *cmd, const char *reason)
log_debug_activation("Entering prioritized section (%s).", reason);
_raise_priority(cmd);
+ _prioritized_section++;
}
void critical_section_dec(struct cmd_context *cmd, const char *reason)
@@ -627,6 +629,9 @@ void critical_section_dec(struct cmd_context *cmd, const char *reason)
log_debug_activation("Leaving critical section (%s).", reason);
} else
log_debug_activation("Leaving section (%s).", reason);
+
+ if (_prioritized_section > 0)
+ _prioritized_section--;
}
int critical_section(void)
@@ -636,7 +641,7 @@ int critical_section(void)
int prioritized_section(void)
{
- return _priority_raised;
+ return _prioritized_section;
}
/*
@@ -680,6 +685,7 @@ void memlock_reset(void)
_mem_locked = 0;
_priority_raised = 0;
_critical_section = 0;
+ _prioritized_section = 0;
_memlock_count_daemon = 0;
}
6 years, 1 month
master - tests: skip test when not enough space
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=f6f8f0c7fda823b1d72...
Commit: f6f8f0c7fda823b1d7261472a6d724118ed19007
Parent: bed869a8a0e66bc4a760b6f56b0d199fc226a179
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Mar 14 11:21:56 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Mar 15 11:01:04 2018 +0100
tests: skip test when not enough space
Make the test skipped instead of failing when there was not
enough space.
---
test/lib/inittest.sh | 2 +-
test/lib/utils.sh | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/lib/inittest.sh b/test/lib/inittest.sh
index 8e4e064..20bc345 100644
--- a/test/lib/inittest.sh
+++ b/test/lib/inittest.sh
@@ -127,7 +127,7 @@ echo "$TESTNAME" >TESTNAME
# Require 50M of free space in testdir
test $(df -k -P . | awk '/\// {print $4}') -gt 51200 ||
- die "Testing requires more then 50M of free space in directory $TESTDIR!\n$(df -H)"
+ skip "Testing requires more then 50M of free space in directory $TESTDIR!\n$(df -H | sed -e 's,^,## DF: ,')"
echo "Kernel is $(uname -a)"
# Report SELinux mode
diff --git a/test/lib/utils.sh b/test/lib/utils.sh
index b6c2ab0..f2a4bde 100644
--- a/test/lib/utils.sh
+++ b/test/lib/utils.sh
@@ -241,7 +241,7 @@ skip() {
if test "$#" -eq 0; then
stacktrace
else
- echo "TEST SKIPPED:" "$@"
+ echo -e "TEST SKIPPED:" "$@"
fi
touch SKIP_THIS_TEST
exit 200
6 years, 1 month
master - tests: use DM_DEBUG_WITH_LINE_NUMBERS
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=bed869a8a0e66bc4a76...
Commit: bed869a8a0e66bc4a760b6f56b0d199fc226a179
Parent: 750fc2e876f49d48e8f883e4e342338b8c4676cd
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Mar 15 10:41:08 2018 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Mar 15 11:01:04 2018 +0100
tests: use DM_DEBUG_WITH_LINE_NUMBERS
Use src:line also for debugging of tools like dmsetup.
---
test/lib/inittest.sh | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/test/lib/inittest.sh b/test/lib/inittest.sh
index 78bd987..8e4e064 100644
--- a/test/lib/inittest.sh
+++ b/test/lib/inittest.sh
@@ -106,6 +106,7 @@ DM_DEV_DIR="$TESTDIR/dev"
LVM_SYSTEM_DIR="$TESTDIR/etc"
# abort on the internal dm errors in the tests (allowing test user override)
DM_ABORT_ON_INTERNAL_ERRORS=${DM_ABORT_ON_INTERNAL_ERRORS:-1}
+DM_DEBUG_WITH_LINE_NUMBERS=${DM_DEBUG_WITH_LINE_NUMBERS:-1}
export DM_DEFAULT_NAME_MANGLING_MODE DM_DEV_DIR LVM_SYSTEM_DIR DM_ABORT_ON_INTERNAL_ERRORS
6 years, 1 month