Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=72d6bdd6b960d946…
Commit: 72d6bdd6b960d946039818684c125c3c31b7ae5e
Parent: 448ff0119fc0f4983917e10b663d9db896f8c5db
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Fri Aug 23 11:03:28 2013 -0500
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Fri Aug 23 11:03:28 2013 -0500
misc: make lv_is_on_pv use for_each_sub_lv to walk LV tree
Make lv_is_on_pv use for_each_sub_lv to walk the LV tree. This
reduces code duplication.
---
lib/metadata/lv_manip.c | 126 ++++++++++++++++++++--------------------------
1 files changed, 55 insertions(+), 71 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index d2830b2..9728310 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -76,88 +76,76 @@ struct lv_names {
const char *new;
};
-/*
- * lv_is_on_pv
- * @lv:
- * @pv:
- *
- * If any of the component devices of the LV are on the given PV, 1
- * is returned; otherwise 0. For example if one of the images of a RAID
- * (or its metadata device) is on the PV, 1 would be returned for the
- * top-level LV.
- * If you wish to check the images themselves, you should pass them.
- * Currently handles:
- * - linear
- * - stripe
- * - RAID
- * - mirror
- * - thin-pool
- * - thin
- *
- * FIXME: This should be made more generic, possibly use 'for_each_sub_lv'.
- * 'for_each_sub_lv' does not yet allow us to short-circuit execution or
- * pass back the values we need yet though (i.e. it only allows success or
- * error - not true or false).
- *
- * Returns: 1 if LV (or part of LV) is on PV, 0 otherwise
- */
-int lv_is_on_pv(struct logical_volume *lv, struct physical_volume *pv)
+struct pv_and_int {
+ struct physical_volume *pv;
+ int *i;
+};
+static int _lv_is_on_pv(struct cmd_context *cmd,
+ struct logical_volume *lv, void *data)
{
+ int *is_on_pv = ((struct pv_and_int *)data)->i;
+ struct physical_volume *pv = ((struct pv_and_int *)data)->pv;
uint32_t s;
struct physical_volume *pv2;
struct lv_segment *seg;
- if (!lv)
- return 0;
-
- seg = first_seg(lv);
- if (!seg)
- return 0;
-
- /* Check mirror log */
- if (lv_is_on_pv(seg->log_lv, pv))
- return 1;
-
- /* Check thin-pool metadata area */
- if (lv_is_on_pv(seg->metadata_lv, pv))
- return 1;
-
- /* Check thin volume's pool LV */
- if (lv_is_on_pv(seg->pool_lv, pv))
- return 1;
+ if (!lv || !(seg = first_seg(lv)))
+ return_0;
/*
- * Do _not_ check 'external_lv. We wouldn't count an origin's
- * PVs as part of a snapshot, so we don't count external_origin's
- * PVs as part of a thin-snap/LV
+ * If the LV has already been found to be on the PV, then
+ * we don't need to continue checking - just return.
*/
+ if (*is_on_pv)
+ return 1;
- /* Check stack of LVs */
dm_list_iterate_items(seg, &lv->segments) {
for (s = 0; s < seg->area_count; s++) {
- if (seg_type(seg, s) == AREA_PV) {
- pv2 = seg_pv(seg, s);
- if (id_equal(&pv->id, &pv2->id))
- return 1;
- if (pv->dev && pv2->dev &&
- (pv->dev->dev == pv2->dev->dev))
- return 1;
- }
-
- if ((seg_type(seg, s) == AREA_LV) &&
- lv_is_on_pv(seg_lv(seg, s), pv))
- return 1;
-
- if (!seg_is_raid(seg))
+ if (seg_type(seg, s) != AREA_PV)
continue;
- /* This is RAID, so we know the meta_area is AREA_LV */
- if (lv_is_on_pv(seg_metalv(seg, s), pv))
+ pv2 = seg_pv(seg, s);
+ if (id_equal(&pv->id, &pv2->id)) {
+ *is_on_pv = 1;
+ return 1;
+ }
+ if (pv->dev && pv2->dev &&
+ (pv->dev->dev == pv2->dev->dev)) {
+ *is_on_pv = 1;
return 1;
+ }
}
}
- return 0;
+ return 1;
+}
+
+/*
+ * lv_is_on_pv
+ * @lv:
+ * @pv:
+ *
+ * If any of the component devices of the LV are on the given PV, 1
+ * is returned; otherwise 0. For example if one of the images of a RAID
+ * (or its metadata device) is on the PV, 1 would be returned for the
+ * top-level LV.
+ * If you wish to check the images themselves, you should pass them.
+ *
+ * Returns: 1 if LV (or part of LV) is on PV, 0 otherwise
+ */
+int lv_is_on_pv(struct logical_volume *lv, struct physical_volume *pv)
+{
+ int is_on_pv = 0;
+ struct pv_and_int context = { pv, &is_on_pv };
+
+ if (!_lv_is_on_pv(lv->vg->cmd, lv, &context) ||
+ !for_each_sub_lv(lv->vg->cmd, lv, _lv_is_on_pv, &context))
+ /* Failure only happens if bad arguments are passed */
+ log_error(INTERNAL_ERROR "for_each_sub_lv failure.");
+
+ log_debug_metadata("%s is %son %s", lv->name,
+ is_on_pv ? "" : "not ", pv_dev_name(pv));
+ return is_on_pv;
}
/*
@@ -173,13 +161,9 @@ int lv_is_on_pvs(struct logical_volume *lv, struct dm_list *pvs)
struct pv_list *pvl;
dm_list_iterate_items(pvl, pvs)
- if (lv_is_on_pv(lv, pvl->pv)) {
- log_debug_metadata("%s is on %s", lv->name,
- pv_dev_name(pvl->pv));
+ if (lv_is_on_pv(lv, pvl->pv))
return 1;
- } else
- log_debug_metadata("%s is not on %s", lv->name,
- pv_dev_name(pvl->pv));
+
return 0;
}
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c59167ec132071d6…
Commit: c59167ec132071d6ab53f928b0775c36a704fe7c
Parent: e5c021316843a3b08e4f6d12ec27f06c20ded7da
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Fri Aug 23 08:57:16 2013 -0500
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Fri Aug 23 08:57:16 2013 -0500
pvmove: Add support for RAID, mirror, and thin
This patch allows pvmove to operate on RAID, mirror and thin LVs.
The key component is the ability to avoid moving a RAID or mirror
sub-LV onto a PV that already has another RAID sub-LV on it.
(e.g. Avoid placing both images of a RAID1 LV on the same PV.)
Top-level LVs are processed to determine which PVs to avoid for
the sake of redundancy, while bottom-level LVs are processed
to determine which segments/extents to move.
This approach does have some drawbacks. By eliminating whole PVs
from the allocation list, we might miss the opportunity to perform
pvmove in some senarios. For example, if we have 3 devices and
a linear uses half of the first, a RAID1 uses half of the first and
half of the second, and a linear uses half of the third (FIGURE 1);
we should be able to pvmove the first device (FIGURE 2).
FIGURE 1:
[ linear ] [ -RAID- ] [ linear ]
[ -RAID- ] [ ] [ ]
FIGURE 2:
[ moved ] [ -RAID- ] [ linear ]
[ moved ] [ linear ] [ -RAID- ]
However, the approach we are using would eliminate the second
device from consideration and would leave us with too little space
for allocation. In these situations, the user does have the ability
to specify LVs and move them one at a time.
---
WHATS_NEW | 1 +
man/pvmove.8.in | 5 +-
tools/pvmove.c | 124 ++++++++++++++++++++++++++++++++++++++++++------------
3 files changed, 100 insertions(+), 30 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 76c2ebb..3ea8786 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.101 -
===================================
+ Add ability to pvmove RAID, mirror, and thin volumes.
Make lvm2-activation-generator silent unless it's in error state.
Remove "mpath major is not dm major" msg for mpath component scan (2.02.94).
Prevent cluster mirror logs from being corrupted by redundant checkpoints.
diff --git a/man/pvmove.8.in b/man/pvmove.8.in
index de20abb..ba6ea1e 100644
--- a/man/pvmove.8.in
+++ b/man/pvmove.8.in
@@ -75,7 +75,8 @@ is updated so that the Logical Volumes reflect the new data locations.
Note that this new process cannot support the original LVM1
type of on-disk metadata. Metadata can be converted using \fBvgconvert\fP(8).
-N.B. The moving of mirrors, snapshots and their origins is not yet supported.
+N.B. The moving of non-thinly provisioned snapshots and their
+origins is not supported.
.SH OPTIONS
See \fBlvm\fP(8) for common options.
@@ -109,7 +110,7 @@ To move all Physical Extents that are used by simple Logical Volumes on
.sp
.B pvmove /dev/sdb1
.P
-Any mirrors, snapshots and their origins are left unchanged.
+Any non-thinly provisioned snapshots and their origins are left unchanged.
.P
Additionally, a specific destination device /dev/sdc1
can be specified like this:
diff --git a/tools/pvmove.c b/tools/pvmove.c
index cb5c9ec..34adc6d 100644
--- a/tools/pvmove.c
+++ b/tools/pvmove.c
@@ -135,6 +135,47 @@ static struct dm_list *_get_allocatable_pvs(struct cmd_context *cmd, int argc,
}
/*
+ * _trim_allocatable_pvs
+ * @alloc_list
+ * @trim_list
+ *
+ * Remove PVs in 'trim_list' from 'alloc_list'.
+ *
+ * Returns: 1 on success, 0 on error
+ */
+static int _trim_allocatable_pvs(struct dm_list *alloc_list,
+ struct dm_list *trim_list,
+ alloc_policy_t alloc)
+{
+ struct dm_list *pvht, *pvh, *trim_pvh;
+ struct pv_list *pvl, *trim_pvl;
+
+ if (!alloc_list) {
+ log_error(INTERNAL_ERROR "alloc_list is NULL");
+ return 0;
+ }
+
+ if (!trim_list || dm_list_empty(trim_list))
+ return 1; /* alloc_list stays the same */
+
+ dm_list_iterate_safe(pvh, pvht, alloc_list) {
+ pvl = dm_list_item(pvh, struct pv_list);
+
+ dm_list_iterate(trim_pvh, trim_list) {
+ trim_pvl = dm_list_item(trim_pvh, struct pv_list);
+
+ /* Don't allocate onto a trim PV */
+ if ((alloc != ALLOC_ANYWHERE) &&
+ (pvl->pv == trim_pvl->pv)) {
+ dm_list_del(&pvl->list);
+ break; /* goto next in alloc_list */
+ }
+ }
+ }
+ return 1;
+}
+
+/*
* Replace any LV segments on given PV with temporary mirror.
* Returns list of LVs changed.
*/
@@ -181,6 +222,7 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
struct logical_volume *lv_mirr, *lv;
struct lv_segment *seg;
struct lv_list *lvl;
+ struct dm_list trim_list;
uint32_t log_count = 0;
int lv_found = 0;
int lv_skipped = 0;
@@ -204,7 +246,50 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
dm_list_init(*lvs_changed);
- /* Find segments to be moved and set up mirrors */
+ /*
+ * First,
+ * use top-level RAID and mirror LVs to build a list of PVs
+ * that must be avoided during allocation. This is necessary
+ * to maintain redundancy of those targets, but it is also
+ * sub-optimal. Avoiding entire PVs in this way limits our
+ * ability to find space for other segment types. In the
+ * majority of cases, however, this method will suffice and
+ * in the cases where it does not, the user can issue the
+ * pvmove on a per-LV basis.
+ *
+ * FIXME: Eliminating entire PVs places too many restrictions
+ * on allocation.
+ */
+ dm_list_iterate_items(lvl, &vg->lvs) {
+ lv = lvl->lv;
+ if (lv == lv_mirr)
+ continue;
+
+ if (lv_name && strcmp(lv->name, lv_name))
+ continue;
+
+ if (!lv_is_on_pvs(lv, source_pvl))
+ continue;
+
+ if (seg_is_raid(first_seg(lv)) ||
+ seg_is_mirrored(first_seg(lv))) {
+ dm_list_init(&trim_list);
+
+ if (!get_pv_list_for_lv(lv->vg->cmd->mem,
+ lv, &trim_list))
+ return_NULL;
+
+ if (!_trim_allocatable_pvs(allocatable_pvs,
+ &trim_list, alloc))
+ return_NULL;
+ }
+ }
+
+ /*
+ * Second,
+ * use bottom-level LVs (like *_mimage_*, *_mlog, *_rmeta_*, etc)
+ * to find segments to be moved and then set up mirrors.
+ */
dm_list_iterate_items(lvl, &vg->lvs) {
lv = lvl->lv;
if (lv == lv_mirr)
@@ -214,38 +299,21 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
continue;
lv_found = 1;
}
+
+ if (!lv_is_on_pvs(lv, source_pvl))
+ continue;
+
if (lv_is_origin(lv) || lv_is_cow(lv)) {
lv_skipped = 1;
log_print_unless_silent("Skipping snapshot-related LV %s", lv->name);
continue;
}
- if (lv_is_raid_type(lv)) {
- seg = first_seg(lv);
- if (seg_is_raid(seg)) {
- lv_skipped = 1;
- log_print_unless_silent("Skipping %s LV %s",
- seg->segtype->ops->name(seg),
- lv->name);
- continue;
- }
- lv_skipped = 1;
- log_print_unless_silent("Skipping RAID sub-LV %s",
- lv->name);
- continue;
- }
- if (lv->status & MIRRORED) {
- lv_skipped = 1;
- log_print_unless_silent("Skipping mirror LV %s", lv->name);
- continue;
- }
- if (lv->status & MIRROR_LOG) {
- lv_skipped = 1;
- log_print_unless_silent("Skipping mirror log LV %s", lv->name);
- continue;
- }
- if (lv->status & MIRROR_IMAGE) {
- lv_skipped = 1;
- log_print_unless_silent("Skipping mirror image LV %s", lv->name);
+ seg = first_seg(lv);
+ if (seg_is_raid(seg) || seg_is_mirrored(seg)) {
+ /*
+ * Pass over top-level LVs - they were handled.
+ * Allow sub-LVs to proceed.
+ */
continue;
}
if (lv_is_thin_volume(lv) || lv_is_thin_pool(lv)) {
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e5c021316843a3b0…
Commit: e5c021316843a3b08e4f6d12ec27f06c20ded7da
Parent: f1e3640df31d0593e47ed82f3bb2f7e976b6569c
Author: Jonathan Brassow <jbrassow(a)redhat.com>
AuthorDate: Fri Aug 23 08:49:16 2013 -0500
Committer: Jonathan Brassow <jbrassow(a)redhat.com>
CommitterDate: Fri Aug 23 08:49:16 2013 -0500
Thin: Make 'lv_is_on_pv(s)' work with thin types
The pool metadata LV must be accounted for when determining what PVs
are in a thin-pool. The pool LV must also be accounted for when
checking thin volumes.
This is a prerequisite for pvmove working with thin types.
---
lib/metadata/lv_manip.c | 24 +++++++++++++++++++++++-
1 files changed, 23 insertions(+), 1 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index ef64d12..d2830b2 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -86,10 +86,18 @@ struct lv_names {
* (or its metadata device) is on the PV, 1 would be returned for the
* top-level LV.
* If you wish to check the images themselves, you should pass them.
+ * Currently handles:
+ * - linear
+ * - stripe
+ * - RAID
+ * - mirror
+ * - thin-pool
+ * - thin
*
* FIXME: This should be made more generic, possibly use 'for_each_sub_lv'.
* 'for_each_sub_lv' does not yet allow us to short-circuit execution or
- * pass back the values we need yet though...
+ * pass back the values we need yet though (i.e. it only allows success or
+ * error - not true or false).
*
* Returns: 1 if LV (or part of LV) is on PV, 0 otherwise
*/
@@ -110,6 +118,20 @@ int lv_is_on_pv(struct logical_volume *lv, struct physical_volume *pv)
if (lv_is_on_pv(seg->log_lv, pv))
return 1;
+ /* Check thin-pool metadata area */
+ if (lv_is_on_pv(seg->metadata_lv, pv))
+ return 1;
+
+ /* Check thin volume's pool LV */
+ if (lv_is_on_pv(seg->pool_lv, pv))
+ return 1;
+
+ /*
+ * Do _not_ check 'external_lv. We wouldn't count an origin's
+ * PVs as part of a snapshot, so we don't count external_origin's
+ * PVs as part of a thin-snap/LV
+ */
+
/* Check stack of LVs */
dm_list_iterate_items(seg, &lv->segments) {
for (s = 0; s < seg->area_count; s++) {
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=be9f4c77c93f3471…
Commit: be9f4c77c93f347131f46a128013b0f4af8e5b32
Parent: 99fe3b88d270fa310d05dd093bea6dd74dc75642
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Thu Aug 22 08:26:35 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Thu Aug 22 08:29:20 2013 +0200
conf: more comments about use_lvmetad + autoactivation relation
---
conf/example.conf.in | 21 +++++++++++++++------
1 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/conf/example.conf.in b/conf/example.conf.in
index 78c69e5..b99f010 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -541,15 +541,24 @@ global {
# Whether to use (trust) a running instance of lvmetad. If this is set to
# 0, all commands fall back to the usual scanning mechanisms. When set to 1
- # *and* when lvmetad is running (it is not auto-started), the volume group
- # metadata and PV state flags are obtained from the lvmetad instance and no
- # scanning is done by the individual commands. In a setup with lvmetad,
- # lvmetad udev rules *must* be set up for LVM to work correctly. Without
- # proper udev rules, all changes in block device configuration will be
- # *ignored* until a manual 'pvscan --cache' is performed.
+ # *and* when lvmetad is running (automatically instantiated by making use of
+ # systemd's socket-based service activation or run as an initscripts service
+ # or run manually), the volume group metadata and PV state flags are obtained
+ # from the lvmetad instance and no scanning is done by the individual
+ # commands. In a setup with lvmetad, lvmetad udev rules *must* be set up for
+ # LVM to work correctly. Without proper udev rules, all changes in block
+ # device configuration will be *ignored* until a manual 'pvscan --cache'
+ # is performed. These rules are installed by default.
#
# If lvmetad has been running while use_lvmetad was 0, it MUST be stopped
# before changing use_lvmetad to 1 and started again afterwards.
+ #
+ # If using lvmetad, the volume activation is also switched to automatic
+ # event-based mode. In this mode, the volumes are activated based on
+ # incoming udev events that automatically inform lvmetad about new PVs
+ # that appear in the system. Once the VG is complete (all the PVs are
+ # present), it is auto-activated. The activation/auto_activation_volume_list
+ # setting controls which volumes are auto-activated (all by default).
use_lvmetad = 0
# Full path of the utility called to check that a thin metadata device
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=99fe3b88d270fa31…
Commit: 99fe3b88d270fa310d05dd093bea6dd74dc75642
Parent: c8daa15270e0e1085776bd227331863e7cf408ae
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Thu Aug 22 08:14:11 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Thu Aug 22 08:27:51 2013 +0200
systemd: lvm2-activation-generator: report only error otherwise be silent
Do not print success status for lvm2-activation-generator:
"LVM: Activation generator successfully completed."
"LVM: Logical Volume autoactivation enabled." (if use_lvmetad=1)
Though this information is quite useful during boot, it may
be confusing for users if it happens anytime later and it
actually happens if systemd reloads. This is usually on package
update to update the systemd state and load any new units that are
newly installed in the system. The systemd reload is global and
so any existing generators are rerun at that moment too.
---
WHATS_NEW | 1 +
.../lvm2_activation_generator_systemd_red_hat.c | 8 +++-----
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 6c0514f..76c2ebb 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.101 -
===================================
+ Make lvm2-activation-generator silent unless it's in error state.
Remove "mpath major is not dm major" msg for mpath component scan (2.02.94).
Prevent cluster mirror logs from being corrupted by redundant checkpoints.
Fix ignored lvmetad update on loop device configuration (2.02.99).
diff --git a/scripts/lvm2_activation_generator_systemd_red_hat.c b/scripts/lvm2_activation_generator_systemd_red_hat.c
index 9d4b581..9cec0a9 100644
--- a/scripts/lvm2_activation_generator_systemd_red_hat.c
+++ b/scripts/lvm2_activation_generator_systemd_red_hat.c
@@ -180,10 +180,8 @@ int main(int argc, char *argv[])
}
/* If lvmetad used, rely on autoactivation instead of direct activation. */
- if (lvm_uses_lvmetad()) {
- kmsg(LOG_DEBUG, "LVM: Logical Volume autoactivation enabled.\n");
+ if (lvm_uses_lvmetad())
goto out;
- }
dir = argc > 1 ? argv[1] : DEFAULT_UNIT_DIR;
@@ -192,8 +190,8 @@ int main(int argc, char *argv[])
!generate_unit(dir, UNIT_NET))
r = EXIT_FAILURE;
out:
- kmsg(r ? LOG_ERR : LOG_DEBUG, "LVM: Activation generator %s.\n",
- r ? "failed" : "successfully completed");
+ if (r)
+ kmsg(LOG_ERR, "LVM: Activation generator failed.\n");
if (kmsg_fd != -1)
(void) close(kmsg_fd);
return r;
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=c8daa15270e0e108…
Commit: c8daa15270e0e1085776bd227331863e7cf408ae
Parent: f0be9ac9047a30bb2befe6a8d9130f466d37d9fd
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Aug 21 14:07:01 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Aug 21 14:07:01 2013 +0200
filter-mpath: remove superfluous error message about mpath major not equal to dm major
This is a regression caused by commit 3bd90488545a4ad5374b4e0f1daba6cf16ae6ae8.
The error message added with that commit "mpath major %d is not dm major %d" is
superfluous.
When scanning for mpath components, we're looking for a parent device.
But this parent device is not necessarily an mpath device (so the dm device)
if it exists - it can be any other device layered on top (e.g. an MD RAID device).
---
WHATS_NEW | 1 +
lib/filters/filter-mpath.c | 5 +----
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 0d58e66..6c0514f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.101 -
===================================
+ Remove "mpath major is not dm major" msg for mpath component scan (2.02.94).
Prevent cluster mirror logs from being corrupted by redundant checkpoints.
Fix ignored lvmetad update on loop device configuration (2.02.99).
Use LVM_PATH instead of hardcoded value in lvm2 activation systemd generator.
diff --git a/lib/filters/filter-mpath.c b/lib/filters/filter-mpath.c
index 1db2264..a9881fd 100644
--- a/lib/filters/filter-mpath.c
+++ b/lib/filters/filter-mpath.c
@@ -181,11 +181,8 @@ static int dev_is_mpath(struct dev_filter *f, struct device *dev)
if (!get_sysfs_get_major_minor(sysfs_dir, parent_name, &major, &minor))
return_0;
- if (major != dt->device_mapper_major) {
- log_error("mpath major %d is not dm major %d.", major,
- dt->device_mapper_major);
+ if (major != dt->device_mapper_major)
return 0;
- }
return lvm_dm_prefix_check(major, minor, MPATH_PREFIX);
}