master - conf: fix typo in report/columns_as_rows config option name recognition
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e758d722c7719f...
Commit: e758d722c7719fba91ae62122fb0359a395f0327
Parent: b0e07d516eab26699b824d5d499a8662e1ab2152
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Thu Aug 25 14:53:32 2016 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Thu Aug 25 14:53:32 2016 +0200
conf: fix typo in report/columns_as_rows config option name recognition
Commit e947c362dd0ae1da2d76925fe6b38244c5f46d25 introduced
config_settings.h file for central place to store all definitions for
config options. By mistake, it used report/colums_as_rows instead
of report/columns_as_rows (missing "n" in "columns").
---
WHATS_NEW | 1 +
conf/command_profile_template.profile.in | 2 +-
lib/config/config_settings.h | 2 +-
tools/reporter.c | 2 +-
4 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 60e052e..99d31be 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ Fix typo in report/columns_as_rows config option name recognition (2.02.99).
Avoid PV tags when checking allocation against parallel PVs.
Disallow mirror conversions of raid10 volumes.
Fix dmeventd unmonitoring when segment type (and dso) changes.
diff --git a/conf/command_profile_template.profile.in b/conf/command_profile_template.profile.in
index 156dc0d..83a2c35 100644
--- a/conf/command_profile_template.profile.in
+++ b/conf/command_profile_template.profile.in
@@ -39,7 +39,7 @@ report {
list_item_separator=","
prefixes=0
quoted=1
- colums_as_rows=0
+ columns_as_rows=0
binary_values_as_numeric=0
time_format="%Y-%m-%d %T %z"
devtypes_sort="devtype_name"
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index fa6a01e..7401725 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -1571,7 +1571,7 @@ cfg(report_prefixes_CFG, "prefixes", report_CFG_SECTION, CFG_PROFILABLE | CFG_DE
cfg(report_quoted_CFG, "quoted", report_CFG_SECTION, CFG_PROFILABLE | CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_REP_QUOTED, vsn(2, 2, 39), NULL, 0, NULL,
"Quote field values when using field name prefixes.\n")
-cfg(report_colums_as_rows_CFG, "colums_as_rows", report_CFG_SECTION, CFG_PROFILABLE | CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_REP_COLUMNS_AS_ROWS, vsn(1, 0, 0), NULL, 0, NULL,
+cfg(report_columns_as_rows_CFG, "columns_as_rows", report_CFG_SECTION, CFG_PROFILABLE | CFG_DEFAULT_COMMENTED, CFG_TYPE_BOOL, DEFAULT_REP_COLUMNS_AS_ROWS, vsn(1, 0, 0), NULL, 0, NULL,
"Output each column as a row.\n"
"If set, this also implies report/prefixes=1.\n")
diff --git a/tools/reporter.c b/tools/reporter.c
index 4a622ed..0df22ff 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -1237,7 +1237,7 @@ static int _config_report(struct cmd_context *cmd, struct report_args *args, str
args->separator = find_config_tree_str(cmd, report_separator_CFG, NULL);
args->field_prefixes = find_config_tree_bool(cmd, report_prefixes_CFG, NULL);
args->quoted = find_config_tree_bool(cmd, report_quoted_CFG, NULL);
- args->columns_as_rows = find_config_tree_bool(cmd, report_colums_as_rows_CFG, NULL);
+ args->columns_as_rows = find_config_tree_bool(cmd, report_columns_as_rows_CFG, NULL);
/* Check PV specifics and do extra changes/actions if needed. */
_check_pv_list(cmd, args, single_args);
7 years, 8 months
master - test: delay writes to all test PVs in lvchange-rebuild-raid.sh to avoid race
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b0e07d516eab26...
Commit: b0e07d516eab26699b824d5d499a8662e1ab2152
Parent: 7ba77681116ce702dc31827ca6d3db6bfd56a269
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Thu Aug 25 01:36:13 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Thu Aug 25 01:37:34 2016 +0200
test: delay writes to all test PVs in lvchange-rebuild-raid.sh to avoid race
---
test/shell/lvchange-rebuild-raid.sh | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvchange-rebuild-raid.sh b/test/shell/lvchange-rebuild-raid.sh
index 4c36836..2c04549 100644
--- a/test/shell/lvchange-rebuild-raid.sh
+++ b/test/shell/lvchange-rebuild-raid.sh
@@ -19,7 +19,10 @@ aux have_raid 1 3 2 || skip
aux prepare_vg 8
# Delay 1st leg so that rebuilding status characters can be read
-aux delay_dev "$dev1" 0 3
+for d in "$dev1" "$dev2" "$dev3" "$dev4" "$dev5" "$dev6" "$dev7" "$dev8"
+do
+ aux delay_dev $d 0 3
+done
# rhbz 1064592
7 years, 8 months
master - alloc: Avoid PV tags too when avoiding parallel PV allocation.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7ba77681116ce7...
Commit: 7ba77681116ce702dc31827ca6d3db6bfd56a269
Parent: bff470f83f7c68ab0cf9b0c23751a5eb8e1d0e43
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Wed Aug 24 19:37:50 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Aug 24 19:41:11 2016 +0100
alloc: Avoid PV tags too when avoiding parallel PV allocation.
Also add debug messages for parallel PVs.
---
WHATS_NEW | 1 +
lib/metadata/lv_manip.c | 56 ++++++++++++++++++++++++++++++----------------
2 files changed, 37 insertions(+), 20 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index b94810c..60e052e 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ Avoid PV tags when checking allocation against parallel PVs.
Disallow mirror conversions of raid10 volumes.
Fix dmeventd unmonitoring when segment type (and dso) changes.
Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 80ccb91..dcc8d86 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -1992,7 +1992,7 @@ static int _is_same_pv(struct pv_match *pvmatch __attribute((unused)), struct pv
static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
struct physical_volume *pv1, uint32_t pv1_start_pe, uint32_t area_num,
struct physical_volume *pv2, struct dm_list *pv_tags, unsigned validate_only,
- struct dm_pool *mem)
+ struct dm_pool *mem, unsigned parallel_pv)
{
const struct dm_config_value *cv;
const char *str;
@@ -2054,10 +2054,14 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
if (!str_list_match_list(&pv1->tags, tags_to_match, &tag_matched))
continue;
else {
- if (!pv_tags)
- log_debug_alloc("Matched allocation PV tag %s on existing %s with free space on %s.",
- tag_matched, pv_dev_name(pv1), pv2 ? pv_dev_name(pv2) : "-");
- else
+ if (!pv_tags) {
+ if (parallel_pv)
+ log_debug_alloc("Not using free space on %s: Matched allocation PV tag %s on existing parallel PV %s.",
+ pv_dev_name(pv1), tag_matched, pv2 ? pv_dev_name(pv2) : "-");
+ else
+ log_debug_alloc("Matched allocation PV tag %s on existing %s with free space on %s.",
+ tag_matched, pv_dev_name(pv1), pv2 ? pv_dev_name(pv2) : "-");
+ } else
log_debug_alloc("Eliminating allocation area %" PRIu32 " at PV %s start PE %" PRIu32
" from consideration: PV tag %s already used.",
area_num, pv_dev_name(pv1), pv1_start_pe, tag_matched);
@@ -2081,10 +2085,14 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
}
continue;
}
- if (!pv_tags)
- log_debug_alloc("Matched allocation PV tag %s on existing %s with free space on %s.",
- str, pv_dev_name(pv1), pv2 ? pv_dev_name(pv2) : "-");
- else
+ if (!pv_tags) {
+ if (parallel_pv)
+ log_debug_alloc("Not using free space on %s: Matched allocation PV tag %s on existing parallel PV %s.",
+ pv2 ? pv_dev_name(pv2) : "-", str, pv_dev_name(pv1));
+ else
+ log_debug_alloc("Matched allocation PV tag %s on existing %s with free space on %s.",
+ str, pv_dev_name(pv1), pv2 ? pv_dev_name(pv2) : "-");
+ } else
log_debug_alloc("Eliminating allocation area %" PRIu32 " at PV %s start PE %" PRIu32
" from consideration: PV tag %s already used.",
area_num, pv_dev_name(pv1), pv1_start_pe, str);
@@ -2100,12 +2108,12 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
static int _validate_tag_list(const struct dm_config_node *cling_tag_list_cn)
{
- return _match_pv_tags(cling_tag_list_cn, NULL, 0, 0, NULL, NULL, 1, NULL);
+ return _match_pv_tags(cling_tag_list_cn, NULL, 0, 0, NULL, NULL, 1, NULL, 0);
}
static int _tags_list_str(struct dm_pool *mem, struct physical_volume *pv1, const struct dm_config_node *cling_tag_list_cn)
{
- if (!_match_pv_tags(cling_tag_list_cn, pv1, 0, 0, NULL, NULL, 0, mem)) {
+ if (!_match_pv_tags(cling_tag_list_cn, pv1, 0, 0, NULL, NULL, 0, mem, 0)) {
dm_pool_abandon_object(mem);
return_0;
}
@@ -2121,7 +2129,7 @@ static int _pv_has_matching_tag(const struct dm_config_node *cling_tag_list_cn,
struct physical_volume *pv1, uint32_t pv1_start_pe, uint32_t area_num,
struct dm_list *pv_tags)
{
- return _match_pv_tags(cling_tag_list_cn, pv1, pv1_start_pe, area_num, NULL, pv_tags, 0, NULL);
+ return _match_pv_tags(cling_tag_list_cn, pv1, pv1_start_pe, area_num, NULL, pv_tags, 0, NULL, 0);
}
/*
@@ -2129,14 +2137,15 @@ static int _pv_has_matching_tag(const struct dm_config_node *cling_tag_list_cn,
* matches a tag of the PV of the existing segment?
*/
static int _pvs_have_matching_tag(const struct dm_config_node *cling_tag_list_cn,
- struct physical_volume *pv1, struct physical_volume *pv2)
+ struct physical_volume *pv1, struct physical_volume *pv2,
+ unsigned parallel_pv)
{
- return _match_pv_tags(cling_tag_list_cn, pv1, 0, 0, pv2, NULL, 0, NULL);
+ return _match_pv_tags(cling_tag_list_cn, pv1, 0, 0, pv2, NULL, 0, NULL, parallel_pv);
}
static int _has_matching_pv_tag(struct pv_match *pvmatch, struct pv_segment *pvseg, struct pv_area *pva)
{
- return _pvs_have_matching_tag(pvmatch->cling_tag_list_cn, pvseg->pv, pva->map->pv);
+ return _pvs_have_matching_tag(pvmatch->cling_tag_list_cn, pvseg->pv, pva->map->pv, 0);
}
static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas,
@@ -2395,7 +2404,7 @@ static int _check_cling_to_alloced(struct alloc_handle *ah, const struct dm_conf
continue; /* Area already assigned */
dm_list_iterate_items(aa, &ah->alloced_areas[s]) {
if ((!cling_tag_list_cn && (pva->map->pv == aa[0].pv)) ||
- (cling_tag_list_cn && _pvs_have_matching_tag(cling_tag_list_cn, pva->map->pv, aa[0].pv))) {
+ (cling_tag_list_cn && _pvs_have_matching_tag(cling_tag_list_cn, pva->map->pv, aa[0].pv, 0))) {
if (positional)
_reserve_required_area(ah, alloc_state, pva, pva->count, s, 0);
return 1;
@@ -2406,13 +2415,20 @@ static int _check_cling_to_alloced(struct alloc_handle *ah, const struct dm_conf
return 0;
}
-static int _pv_is_parallel(struct physical_volume *pv, struct dm_list *parallel_pvs)
+static int _pv_is_parallel(struct physical_volume *pv, struct dm_list *parallel_pvs, const struct dm_config_node *cling_tag_list_cn)
{
struct pv_list *pvl;
- dm_list_iterate_items(pvl, parallel_pvs)
- if (pv == pvl->pv)
+ dm_list_iterate_items(pvl, parallel_pvs) {
+ if (pv == pvl->pv) {
+ log_debug_alloc("Not using free space on existing parallel PV %s.",
+ pv_dev_name(pvl->pv));
+ return 1;
+ }
+ if (cling_tag_list_cn && _pvs_have_matching_tag(cling_tag_list_cn, pvl->pv, pv, 1))
return 1;
+ }
+
return 0;
}
@@ -2700,7 +2716,7 @@ static int _find_some_parallel_space(struct alloc_handle *ah,
/* FIXME Split into log and non-log parallel_pvs and only check the log ones if log_iteration? */
/* (I've temporatily disabled the check.) */
/* Avoid PVs used by existing parallel areas */
- if (!log_iteration_count && parallel_pvs && _pv_is_parallel(pvm->pv, parallel_pvs))
+ if (!log_iteration_count && parallel_pvs && _pv_is_parallel(pvm->pv, parallel_pvs, ah->cling_tag_list_cn))
goto next_pv;
/*
7 years, 8 months
master - test: add missing lvchange-rebuild-raid.sh
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=bff470f83f7c68...
Commit: bff470f83f7c68ab0cf9b0c23751a5eb8e1d0e43
Parent: 40a4f5f38faaa93bf95422f0a12d93df6c484e79
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Wed Aug 24 18:22:34 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Wed Aug 24 18:22:34 2016 +0200
test: add missing lvchange-rebuild-raid.sh
---
test/shell/lvchange-rebuild-raid.sh | 125 +++++++++++++++++++++++++++++++++++
1 files changed, 125 insertions(+), 0 deletions(-)
diff --git a/test/shell/lvchange-rebuild-raid.sh b/test/shell/lvchange-rebuild-raid.sh
new file mode 100644
index 0000000..4c36836
--- /dev/null
+++ b/test/shell/lvchange-rebuild-raid.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+# Copyright (C) 2016 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+SKIP_WITH_LVMLOCKD=1
+SKIP_WITH_LVMPOLLD=1
+
+. lib/inittest
+
+aux have_raid 1 3 2 || skip
+
+aux prepare_vg 8
+
+# Delay 1st leg so that rebuilding status characters can be read
+aux delay_dev "$dev1" 0 3
+
+# rhbz 1064592
+
+##############################################
+# Create an 8-way striped raid10 with 4 mirror
+# groups and rebuild selected PVs.
+lvcreate --type raid10 -m 1 -i 4 -l 2 -n $lv1 $vg
+aux wait_for_sync $vg $lv1
+
+# Rebuild 1st and 2nd device would rebuild a
+# whole mirror group and needs to be rejected.
+not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" $vg/$lv1
+not aux check_status_chars $vg $lv1 "aAaAAAAA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild 1st and 3nd device from different mirror groups is fine.
+lvchange --yes --rebuild "$dev1" --rebuild "$dev3" $vg/$lv1
+aux check_status_chars $vg $lv1 "aAaAAAAA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild devices 1, 3, 6 from different mirror groups is fine.
+lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" $vg/$lv1
+aux check_status_chars $vg $lv1 "aAaAAaAA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild devices 1, 3, 5 and 6 with 5+6 being
+# being a whole mirror group needs to be rejected.
+not lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev6" --rebuild "$dev5" $vg/$lv1
+not aux check_status_chars $vg $lv1 "aAaAaaAA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild devices 1, 3, 5 and 7 from different mirror groups is fine.
+lvchange --yes --rebuild "$dev1" --rebuild "$dev3" --rebuild "$dev5" --rebuild "$dev7" $vg/$lv1
+aux check_status_chars $vg $lv1 "aAaAaAaA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild devices 2, 4, 6 and 8 from different mirror groups is fine.
+lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
+aux check_status_chars $vg $lv1 "AaAaAaAa"
+aux wait_for_sync $vg $lv1
+
+##############################################
+# Create an 8-legged raid1 and rebuild selected PVs
+lvremove --yes $vg/$lv1
+lvcreate --yes --type raid1 -m 7 -l 2 -n $lv1 $vg
+aux wait_for_sync $vg $lv1
+
+# Rebuilding all raid1 legs needs to be rejected.
+not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
+ --rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
+not aux check_status_chars $vg $lv1 "aaaaaaaa"
+aux wait_for_sync $vg $lv1
+
+# Rebuilding all but the raid1 master leg is fine.
+lvchange --yes --rebuild "$dev2" --rebuild "$dev3" --rebuild "$dev4" \
+ --rebuild "$dev5" --rebuild "$dev6" --rebuild "$dev7" --rebuild "$dev8" $vg/$lv1
+aux check_status_chars $vg $lv1 "Aaaaaaaa"
+aux wait_for_sync $vg $lv1
+
+# Rebuilding the raid1 master leg is fine.
+lvchange --yes --rebuild "$dev1" $vg/$lv1
+aux check_status_chars $vg $lv1 "aAAAAAAA"
+aux wait_for_sync $vg $lv1
+
+# Rebuild legs on devices 2, 4, 6 and 8 is fine.
+lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" --rebuild "$dev8" $vg/$lv1
+aux check_status_chars $vg $lv1 "AaAaAaAa"
+aux wait_for_sync $vg $lv1
+
+##############################################
+# Create an 6-legged raid6 and rebuild selected PVs
+lvremove --yes $vg/$lv1
+lvcreate --yes --type raid6 -i 4 -l 2 -n $lv1 $vg
+aux wait_for_sync $vg $lv1
+
+# Rebuilding all raid6 stripes needs to be rejected.
+not lvchange --yes --rebuild "$dev1" --rebuild "$dev2" --rebuild "$dev3" \
+ --rebuild "$dev4" --rebuild "$dev5" --rebuild "$dev6" $vg/$lv1
+not aux check_status_chars $vg $lv1 "aaaaaa"
+aux wait_for_sync $vg $lv1
+
+# Rebuilding more than 2 raid6 stripes needs to be rejected.
+not lvchange --yes --rebuild "$dev2" --rebuild "$dev4" --rebuild "$dev6" $vg/$lv1
+not aux check_status_chars $vg $lv1 "AaAaAa"
+aux wait_for_sync $vg $lv1
+
+# Rebuilding any 1 raid6 stripe is fine.
+lvchange --yes --rebuild "$dev2" $vg/$lv1
+aux check_status_chars $vg $lv1 "AaAAAA"
+aux wait_for_sync $vg $lv1
+lvchange --yes --rebuild "$dev5" $vg/$lv1
+aux check_status_chars $vg $lv1 "AAAAaA"
+aux wait_for_sync $vg $lv1
+
+# Rebuilding any 2 raid6 stripes is fine.
+lvchange --yes --rebuild "$dev2" --rebuild "$dev4" $vg/$lv1
+aux check_status_chars $vg $lv1 "AaAaAA"
+aux wait_for_sync $vg $lv1
+lvchange --yes --rebuild "$dev1" --rebuild "$dev5" $vg/$lv1
+aux check_status_chars $vg $lv1 "aAAAaA"
+aux wait_for_sync $vg $lv1
+
+vgremove -ff $vg
7 years, 8 months
master - alloc: Record PV tags of parallel PVs in log.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=40a4f5f38faaa9...
Commit: 40a4f5f38faaa93bf95422f0a12d93df6c484e79
Parent: 68adf2c1999ae57cd50a69ee1047dca6b4877216
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Wed Aug 24 15:49:34 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Aug 24 15:49:34 2016 +0100
alloc: Record PV tags of parallel PVs in log.
---
lib/metadata/lv_manip.c | 91 ++++++++++++++++++++++++++++-------------------
1 files changed, 54 insertions(+), 37 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 31b20b0..80ccb91 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -1987,25 +1987,20 @@ static int _is_same_pv(struct pv_match *pvmatch __attribute((unused)), struct pv
/*
* Does PV area have a tag listed in allocation/cling_tag_list that
* matches EITHER a tag of the PV of the existing segment OR a tag in pv_tags?
- * If tags_list_str is set, then instead we generate a list of matching tags for printing.
+ * If mem is set, then instead we append a list of matching tags for printing to the object there.
*/
static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
struct physical_volume *pv1, uint32_t pv1_start_pe, uint32_t area_num,
struct physical_volume *pv2, struct dm_list *pv_tags, unsigned validate_only,
- struct dm_pool *mem, const char **tags_list_str)
+ struct dm_pool *mem)
{
const struct dm_config_value *cv;
const char *str;
const char *tag_matched;
- struct dm_list *tags_to_match = tags_list_str ? NULL : pv_tags ? : &pv2->tags;
+ struct dm_list *tags_to_match = mem ? NULL : pv_tags ? : &pv2->tags;
struct dm_str_list *sl;
unsigned first_tag = 1;
- if (tags_list_str && !dm_pool_begin_object(mem, 256)) {
- log_error("PV tags string allocation failed");
- return 0;
- }
-
for (cv = cling_tag_list_cn->v; cv; cv = cv->next) {
if (cv->type != DM_CFG_STRING) {
if (validate_only)
@@ -2042,16 +2037,14 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
/* Wildcard matches any tag against any tag. */
if (!strcmp(str, "*")) {
- if (tags_list_str) {
+ if (mem) {
dm_list_iterate_items(sl, &pv1->tags) {
if (!first_tag && !dm_pool_grow_object(mem, ",", 0)) {
- dm_pool_abandon_object(mem);
log_error("PV tags string extension failed.");
return 0;
}
first_tag = 0;
if (!dm_pool_grow_object(mem, sl->str, 0)) {
- dm_pool_abandon_object(mem);
log_error("PV tags string extension failed.");
return 0;
}
@@ -2076,15 +2069,13 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
(tags_to_match && !str_list_match_item(tags_to_match, str)))
continue;
else {
- if (tags_list_str) {
+ if (mem) {
if (!first_tag && !dm_pool_grow_object(mem, ",", 0)) {
- dm_pool_abandon_object(mem);
log_error("PV tags string extension failed.");
return 0;
}
first_tag = 0;
if (!dm_pool_grow_object(mem, str, 0)) {
- dm_pool_abandon_object(mem);
log_error("PV tags string extension failed.");
return 0;
}
@@ -2101,32 +2092,25 @@ static int _match_pv_tags(const struct dm_config_node *cling_tag_list_cn,
}
}
- if (tags_list_str) {
- if (!dm_pool_grow_object(mem, "\0", 1)) {
- dm_pool_abandon_object(mem);
- log_error("PV tags string extension failed.");
- return 0;
- }
- *tags_list_str = dm_pool_end_object(mem);
+ if (mem)
return 1;
- }
return 0;
}
static int _validate_tag_list(const struct dm_config_node *cling_tag_list_cn)
{
- return _match_pv_tags(cling_tag_list_cn, NULL, 0, 0, NULL, NULL, 1, NULL, NULL);
+ return _match_pv_tags(cling_tag_list_cn, NULL, 0, 0, NULL, NULL, 1, NULL);
}
-static const char *_tags_list_str(struct alloc_handle *ah, struct physical_volume *pv1)
+static int _tags_list_str(struct dm_pool *mem, struct physical_volume *pv1, const struct dm_config_node *cling_tag_list_cn)
{
- const char *tags_list_str;
-
- if (!_match_pv_tags(ah->cling_tag_list_cn, pv1, 0, 0, NULL, NULL, 0, ah->mem, &tags_list_str))
- return_NULL;
+ if (!_match_pv_tags(cling_tag_list_cn, pv1, 0, 0, NULL, NULL, 0, mem)) {
+ dm_pool_abandon_object(mem);
+ return_0;
+ }
- return tags_list_str;
+ return 1;
}
/*
@@ -2137,7 +2121,7 @@ static int _pv_has_matching_tag(const struct dm_config_node *cling_tag_list_cn,
struct physical_volume *pv1, uint32_t pv1_start_pe, uint32_t area_num,
struct dm_list *pv_tags)
{
- return _match_pv_tags(cling_tag_list_cn, pv1, pv1_start_pe, area_num, NULL, pv_tags, 0, NULL, NULL);
+ return _match_pv_tags(cling_tag_list_cn, pv1, pv1_start_pe, area_num, NULL, pv_tags, 0, NULL);
}
/*
@@ -2147,7 +2131,7 @@ static int _pv_has_matching_tag(const struct dm_config_node *cling_tag_list_cn,
static int _pvs_have_matching_tag(const struct dm_config_node *cling_tag_list_cn,
struct physical_volume *pv1, struct physical_volume *pv2)
{
- return _match_pv_tags(cling_tag_list_cn, pv1, 0, 0, pv2, NULL, 0, NULL, NULL);
+ return _match_pv_tags(cling_tag_list_cn, pv1, 0, 0, pv2, NULL, 0, NULL);
}
static int _has_matching_pv_tag(struct pv_match *pvmatch, struct pv_segment *pvseg, struct pv_area *pva)
@@ -2155,32 +2139,56 @@ static int _has_matching_pv_tag(struct pv_match *pvmatch, struct pv_segment *pvs
return _pvs_have_matching_tag(pvmatch->cling_tag_list_cn, pvseg->pv, pva->map->pv);
}
-static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
+static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas,
+ const struct dm_config_node *cling_tag_list_cn)
{
struct seg_pvs *spvs;
struct pv_list *pvl;
char *pvnames;
+ unsigned first;
if (!parallel_areas)
return 1;
dm_list_iterate_items(spvs, parallel_areas) {
+ first = 1;
+
if (!dm_pool_begin_object(mem, 256)) {
log_error("dm_pool_begin_object failed");
return 0;
}
dm_list_iterate_items(pvl, &spvs->pvs) {
- if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
+ if (!first && !dm_pool_grow_object(mem, " ", 1)) {
log_error("dm_pool_grow_object failed");
dm_pool_abandon_object(mem);
return 0;
}
- if (!dm_pool_grow_object(mem, " ", 1)) {
+
+ if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
log_error("dm_pool_grow_object failed");
dm_pool_abandon_object(mem);
return 0;
}
+
+ if (cling_tag_list_cn) {
+ if (!dm_pool_grow_object(mem, "(", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ if (!_tags_list_str(mem, pvl->pv, cling_tag_list_cn)) {
+ dm_pool_abandon_object(mem);
+ return_0;
+ }
+ if (!dm_pool_grow_object(mem, ")", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ }
+
+ first = 0;
}
if (!dm_pool_grow_object(mem, "\0", 1)) {
@@ -2218,8 +2226,17 @@ static void _reserve_area(struct alloc_handle *ah, struct alloc_state *alloc_sta
struct pv_area_used *area_used = &alloc_state->areas[ix_pva];
const char *pv_tag_list = NULL;
- if (ah->cling_tag_list_cn)
- pv_tag_list = _tags_list_str(ah, pva->map->pv);
+ if (ah->cling_tag_list_cn) {
+ if (!dm_pool_begin_object(ah->mem, 256))
+ log_error("PV tags string allocation failed");
+ else if (!_tags_list_str(ah->mem, pva->map->pv, ah->cling_tag_list_cn))
+ dm_pool_abandon_object(ah->mem);
+ else if (!dm_pool_grow_object(ah->mem, "\0", 1)) {
+ dm_pool_abandon_object(ah->mem);
+ log_error("PV tags string extension failed.");
+ } else
+ pv_tag_list = dm_pool_end_object(ah->mem);
+ }
log_debug_alloc("%s allocation area %" PRIu32 " %s %s start PE %" PRIu32
" length %" PRIu32 " leaving %" PRIu32 "%s%s.",
@@ -3001,7 +3018,7 @@ static int _allocate(struct alloc_handle *ah,
if (!(pvms = create_pv_maps(ah->mem, vg, allocatable_pvs)))
return_0;
- if (!_log_parallel_areas(ah->mem, ah->parallel_areas))
+ if (!_log_parallel_areas(ah->mem, ah->parallel_areas, ah->cling_tag_list_cn))
stack;
alloc_state.areas_size = dm_list_size(pvms);
7 years, 8 months
master - alloc: Move _log_parallel_areas.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=68adf2c1999ae5...
Commit: 68adf2c1999ae57cd50a69ee1047dca6b4877216
Parent: 7837fbc1c191925ebe6bef74845d61396c1050e6
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Wed Aug 24 15:39:56 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Aug 24 15:47:38 2016 +0100
alloc: Move _log_parallel_areas.
---
WHATS_NEW | 2 +-
lib/metadata/lv_manip.c | 86 +++++++++++++++++++++++-----------------------
2 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 315e7f9..b94810c 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,6 @@
Version 2.02.165 -
===================================
- Disallow segtype and mirror conversions of raid10 volumes.
+ Disallow mirror conversions of raid10 volumes.
Fix dmeventd unmonitoring when segment type (and dso) changes.
Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index cb7e6b7..31b20b0 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -1674,49 +1674,6 @@ static void _init_alloc_parms(struct alloc_handle *ah,
alloc_parms->flags |= A_CAN_SPLIT;
}
-static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
-{
- struct seg_pvs *spvs;
- struct pv_list *pvl;
- char *pvnames;
-
- if (!parallel_areas)
- return 1;
-
- dm_list_iterate_items(spvs, parallel_areas) {
- if (!dm_pool_begin_object(mem, 256)) {
- log_error("dm_pool_begin_object failed");
- return 0;
- }
-
- dm_list_iterate_items(pvl, &spvs->pvs) {
- if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
- if (!dm_pool_grow_object(mem, " ", 1)) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
- }
-
- if (!dm_pool_grow_object(mem, "\0", 1)) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
-
- pvnames = dm_pool_end_object(mem);
- log_debug_alloc("Parallel PVs at LE %" PRIu32 " length %" PRIu32 ": %s",
- spvs->le, spvs->len, pvnames);
- dm_pool_free(mem, pvnames);
- }
-
- return 1;
-}
-
/* Handles also stacking */
static int _setup_lv_size(struct logical_volume *lv, uint32_t extents)
{
@@ -2198,6 +2155,49 @@ static int _has_matching_pv_tag(struct pv_match *pvmatch, struct pv_segment *pvs
return _pvs_have_matching_tag(pvmatch->cling_tag_list_cn, pvseg->pv, pva->map->pv);
}
+static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
+{
+ struct seg_pvs *spvs;
+ struct pv_list *pvl;
+ char *pvnames;
+
+ if (!parallel_areas)
+ return 1;
+
+ dm_list_iterate_items(spvs, parallel_areas) {
+ if (!dm_pool_begin_object(mem, 256)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ dm_list_iterate_items(pvl, &spvs->pvs) {
+ if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ if (!dm_pool_grow_object(mem, " ", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ }
+
+ if (!dm_pool_grow_object(mem, "\0", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+
+ pvnames = dm_pool_end_object(mem);
+ log_debug_alloc("Parallel PVs at LE %" PRIu32 " length %" PRIu32 ": %s",
+ spvs->le, spvs->len, pvnames);
+ dm_pool_free(mem, pvnames);
+ }
+
+ return 1;
+}
+
/*
* Is PV area contiguous to PV segment?
*/
7 years, 8 months
master - alloc: Move _log_parallel_areas.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=157fbd9699b1a0...
Commit: 157fbd9699b1a03ab73c0fefdb524c68785ebe5b
Parent: 7837fbc1c191925ebe6bef74845d61396c1050e6
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Wed Aug 24 15:39:56 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Wed Aug 24 15:40:26 2016 +0100
alloc: Move _log_parallel_areas.
---
WHATS_NEW | 2 +-
lib/metadata/lv_manip.c | 86 +++++++++++++++++++++++-----------------------
2 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 315e7f9..b94810c 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,6 @@
Version 2.02.165 -
===================================
- Disallow segtype and mirror conversions of raid10 volumes.
+ Disallow mirror conversions of raid10 volumes.
Fix dmeventd unmonitoring when segment type (and dso) changes.
Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index cb7e6b7..b13e924 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -1674,49 +1674,6 @@ static void _init_alloc_parms(struct alloc_handle *ah,
alloc_parms->flags |= A_CAN_SPLIT;
}
-static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
-{
- struct seg_pvs *spvs;
- struct pv_list *pvl;
- char *pvnames;
-
- if (!parallel_areas)
- return 1;
-
- dm_list_iterate_items(spvs, parallel_areas) {
- if (!dm_pool_begin_object(mem, 256)) {
- log_error("dm_pool_begin_object failed");
- return 0;
- }
-
- dm_list_iterate_items(pvl, &spvs->pvs) {
- if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
- if (!dm_pool_grow_object(mem, " ", 1)) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
- }
-
- if (!dm_pool_grow_object(mem, "\0", 1)) {
- log_error("dm_pool_grow_object failed");
- dm_pool_abandon_object(mem);
- return 0;
- }
-
- pvnames = dm_pool_end_object(mem);
- log_debug_alloc("Parallel PVs at LE %" PRIu32 " length %" PRIu32 ": %s",
- spvs->le, spvs->len, pvnames);
- dm_pool_free(mem, pvnames);
- }
-
- return 1;
-}
-
/* Handles also stacking */
static int _setup_lv_size(struct logical_volume *lv, uint32_t extents)
{
@@ -2212,6 +2169,49 @@ static int _is_contiguous(struct pv_match *pvmatch __attribute((unused)), struct
return 1;
}
+static int _log_parallel_areas(struct dm_pool *mem, struct dm_list *parallel_areas)
+{
+ struct seg_pvs *spvs;
+ struct pv_list *pvl;
+ char *pvnames;
+
+ if (!parallel_areas)
+ return 1;
+
+ dm_list_iterate_items(spvs, parallel_areas) {
+ if (!dm_pool_begin_object(mem, 256)) {
+ log_error("dm_pool_begin_object failed");
+ return 0;
+ }
+
+ dm_list_iterate_items(pvl, &spvs->pvs) {
+ if (!dm_pool_grow_object(mem, pv_dev_name(pvl->pv), strlen(pv_dev_name(pvl->pv)))) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ if (!dm_pool_grow_object(mem, " ", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+ }
+
+ if (!dm_pool_grow_object(mem, "\0", 1)) {
+ log_error("dm_pool_grow_object failed");
+ dm_pool_abandon_object(mem);
+ return 0;
+ }
+
+ pvnames = dm_pool_end_object(mem);
+ log_debug_alloc("Parallel PVs at LE %" PRIu32 " length %" PRIu32 ": %s",
+ spvs->le, spvs->len, pvnames);
+ dm_pool_free(mem, pvnames);
+ }
+
+ return 1;
+}
+
static void _reserve_area(struct alloc_handle *ah, struct alloc_state *alloc_state, struct pv_area *pva,
uint32_t required, uint32_t ix_pva, uint32_t unreserved)
{
7 years, 8 months
master - lvconvert: Disallow raid10 mirror conversions.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7837fbc1c19192...
Commit: 7837fbc1c191925ebe6bef74845d61396c1050e6
Parent: 2d65ce9711dace22cebb370b0d93fd7a98213bd8
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Aug 23 23:40:16 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Aug 23 23:40:16 2016 +0100
lvconvert: Disallow raid10 mirror conversions.
---
WHATS_NEW | 1 +
tools/lvconvert.c | 5 +++++
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index fdf63e4..315e7f9 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.165 -
===================================
+ Disallow segtype and mirror conversions of raid10 volumes.
Fix dmeventd unmonitoring when segment type (and dso) changes.
Don't allow lvconvert --repair on raid0 devices or attempt to monitor them.
No longer adjust incorrect number of raid stripes supplied to lvcreate.
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index fefec7c..457724c 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1849,6 +1849,11 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
lvseg_name(seg));
return 0;
}
+ if (seg_is_raid10(seg)) {
+ log_error("--mirrors/-m cannot be changed with %s.",
+ lvseg_name(seg));
+ return 0;
+ }
}
if (!_lvconvert_validate_thin(lv, lp))
7 years, 8 months
master - dmeventd: Add fixed timeout when unmonitoring.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2d65ce9711dace...
Commit: 2d65ce9711dace22cebb370b0d93fd7a98213bd8
Parent: db0e34535c82cfb73af19a7673de82881ad2468c
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Aug 23 16:09:18 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Aug 23 16:09:18 2016 +0100
dmeventd: Add fixed timeout when unmonitoring.
---
lib/activate/activate.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 22e3afa..f4d3a17 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1853,7 +1853,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
continue;
if (new_unmonitor) {
- if (!target_register_events(cmd, dso, lv, 0, 0, 0)) {
+ if (!target_register_events(cmd, dso, lv, 0, 0, 10)) {
log_error("%s: segment unmonitoring failed.",
display_lvname(lv));
7 years, 8 months
master - libdm: add some comments about DM_UDEV_DISABLE_LIBRARY_FALLBACK flag
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=db0e34535c82cf...
Commit: db0e34535c82cfb73af19a7673de82881ad2468c
Parent: b975532433dcbcc01e3cc0ebe8c6165e2d6470f8
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Aug 23 15:57:47 2016 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Aug 23 15:58:03 2016 +0200
libdm: add some comments about DM_UDEV_DISABLE_LIBRARY_FALLBACK flag
---
libdm/libdevmapper.h | 14 +++++++++++++-
1 files changed, 13 insertions(+), 1 deletions(-)
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 5246b15..5790486 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -216,6 +216,7 @@ int dm_task_set_major_minor(struct dm_task *dmt, int major, int minor, int allow
int dm_task_set_uid(struct dm_task *dmt, uid_t uid);
int dm_task_set_gid(struct dm_task *dmt, gid_t gid);
int dm_task_set_mode(struct dm_task *dmt, mode_t mode);
+/* See also description for DM_UDEV_DISABLE_LIBRARY_FALLBACK flag! */
int dm_task_set_cookie(struct dm_task *dmt, uint32_t *cookie, uint16_t flags);
int dm_task_set_event_nr(struct dm_task *dmt, uint32_t event_nr);
int dm_task_set_geometry(struct dm_task *dmt, const char *cylinders, const char *heads, const char *sectors, const char *start);
@@ -3496,7 +3497,18 @@ struct dm_pool *dm_config_memory(struct dm_config_tree *cft);
* DM_UDEV_DISABLE_LIBRARY_FALLBACK is set in case we need to disable
* libdevmapper's node management. We will rely on udev completely
* and there will be no fallback action provided by libdevmapper if
- * udev does something improperly.
+ * udev does something improperly. Using the library fallback code has
+ * a consequence that you need to take into account: any device node
+ * or symlink created without udev is not recorded in udev database
+ * which other applications may read to get complete list of devices.
+ * For this reason, use of DM_UDEV_DISABLE_LIBRARY_FALLBACK is
+ * recommended on systems where udev is used. Keep library fallback
+ * enabled just for exceptional cases where you need to debug udev-related
+ * problems. If you hit such problems, please contact us through upstream
+ * LVM2 development mailing list (see also README file). This flag is
+ * currently not set by default in libdevmapper so you need to set it
+ * explicitly if you're sure that udev is behaving correctly on your
+ * setups.
*/
#define DM_UDEV_DISABLE_LIBRARY_FALLBACK 0x0020
/*
7 years, 8 months