master - cleanup: remove unused variables
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=094488ffab4837...
Commit: 094488ffab4837fa14069b81a15e0a6bdaca8a73
Parent: 926a56578185c7f22c9b3e9c36ff660ce6288c16
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 15:53:50 2016 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Sep 21 15:53:50 2016 +0200
cleanup: remove unused variables
---
lib/metadata/lv.c | 1 -
tools/lvconvert.c | 1 -
2 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 60374dd..70036f9 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -988,7 +988,6 @@ int lv_mirror_image_in_sync(const struct logical_volume *lv)
int lv_raid_image_in_sync(const struct logical_volume *lv)
{
unsigned s;
- dm_percent_t percent;
char *raid_health;
struct lv_segment *seg, *raid_seg = NULL;
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 4095101..3607247 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1826,7 +1826,6 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
struct dm_list *failed_pvs;
struct cmd_context *cmd = lv->vg->cmd;
struct lv_segment *seg = first_seg(lv);
- dm_percent_t sync_percent;
if (_linear_type_requested(lp->type_str)) {
if (arg_is_set(cmd, mirrors_ARG) && (arg_uint_value(cmd, mirrors_ARG, 0) != 0)) {
7 years, 7 months
master - coverity: dmsetup: fix possible use of uninitialized value
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=926a56578185c7...
Commit: 926a56578185c7f22c9b3e9c36ff660ce6288c16
Parent: 7ea5758c919022e6bca9ebe15aec160fd5ef2430
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Sep 21 15:52:23 2016 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Sep 21 15:52:23 2016 +0200
coverity: dmsetup: fix possible use of uninitialized value
---
tools/dmsetup.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index 5f4c192..5b817bb 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -4956,7 +4956,7 @@ static int _stats_create_file(CMD_ARGS)
struct dm_histogram *bounds = NULL;
char *path, *abspath = NULL;
struct dm_stats *dms = NULL;
- int group, fd, precise;
+ int group, fd = -1, precise;
if (_switches[AREAS_ARG] || _switches[AREA_SIZE_ARG]) {
log_error("--filemap is incompatible with --areas and --area-size.");
7 years, 7 months
master - dmsetup: ensure --filemap histogram bounds are freed
by Bryn Reeves
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7ea5758c919022...
Commit: 7ea5758c919022e6bca9ebe15aec160fd5ef2430
Parent: 5d455b28fce16fce20f33279fe3b1b682c57e619
Author: Bryn M. Reeves <bmr(a)redhat.com>
AuthorDate: Wed Sep 14 15:44:51 2016 +0100
Committer: Bryn M. Reeves <bmr(a)redhat.com>
CommitterDate: Wed Sep 21 10:09:20 2016 +0100
dmsetup: ensure --filemap histogram bounds are freed
Make sure that the temporary dm_histogram used for the bounds
argument is freed in the case that the user provided a --bounds
argument on the command line.
---
tools/dmsetup.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index ff42a9e..5f4c192 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -4951,12 +4951,12 @@ static char *_get_abspath(const char *path)
static int _stats_create_file(CMD_ARGS)
{
const char *alias, *program_id = DM_STATS_PROGRAM_ID;
- const char *histogram = _string_args[BOUNDS_ARG];
+ const char *bounds_str = _string_args[BOUNDS_ARG];
uint64_t *regions, *region, count = 0;
struct dm_histogram *bounds = NULL;
char *path, *abspath = NULL;
+ struct dm_stats *dms = NULL;
int group, fd, precise;
- struct dm_stats *dms;
if (_switches[AREAS_ARG] || _switches[AREA_SIZE_ARG]) {
log_error("--filemap is incompatible with --areas and --area-size.");
@@ -5017,7 +5017,8 @@ static int _stats_create_file(CMD_ARGS)
return 0;
}
- if (histogram && !(bounds = dm_histogram_bounds_from_string(histogram))) {
+ if (bounds_str
+ && !(bounds = dm_histogram_bounds_from_string(bounds_str))) {
dm_free(abspath);
return_0;
}
@@ -5031,7 +5032,7 @@ static int _stats_create_file(CMD_ARGS)
group = !_switches[NOGROUP_ARG];
if (!(dms = dm_stats_create(DM_STATS_PROGRAM_ID)))
- return_0;
+ goto_bad;
fd = open(abspath, O_RDONLY);
@@ -5087,16 +5088,20 @@ static int _stats_create_file(CMD_ARGS)
dm_free(regions);
dm_free(abspath);
+ dm_free(bounds);
dm_stats_destroy(dms);
return 1;
bad:
dm_free(abspath);
+ dm_free(bounds);
if ((fd > -1) && close(fd))
log_error("Error closing %s", path);
- dm_stats_destroy(dms);
+ if (dms)
+ dm_stats_destroy(dms);
+
return 0;
}
7 years, 7 months
master - lvconvert: fix (automatic) raid repair regression
by Heinz Mauelshagen
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=5d455b28fce16f...
Commit: 5d455b28fce16fce20f33279fe3b1b682c57e619
Parent: 78e0fdb6182e8cae26998510760caf7afe237c39
Author: Heinz Mauelshagen <heinzm(a)redhat.com>
AuthorDate: Wed Sep 21 00:38:38 2016 +0200
Committer: Heinz Mauelshagen <heinzm(a)redhat.com>
CommitterDate: Wed Sep 21 00:39:29 2016 +0200
lvconvert: fix (automatic) raid repair regression
The dm-raid target now rejects device rebuild requests during ongoing
resynchronization thus causing 'lvconvert --repair ...' to fail with
a kernel error message. This regresses with respect to failing automatic
repair via the dmeventd RAID plugin in case raid_fault_policy="allocate"
is configured in lvm.conf as well.
Previously allowing such repair request required cancelling the
resynchronization of any still accessible DataLVs, hence reasoning
potential data loss.
Patch allows the resynchronization of still accessible DataLVs to
finish up by rejecting any 'lvconvert --repair ...'.
It enhances the dmeventd RAID plugin to be able to automatically repair
by postponing the repair after synchronization ended.
More tests are added to lvconvert-rebuild-raid.sh to cover single
and multiple DataLV failure cases for the different RAID levels.
- resolves: rhbz1371717
---
WHATS_NEW | 1 +
daemons/dmeventd/plugins/raid/dmeventd_raid.c | 42 ++++++++--
lib/metadata/lv.c | 6 --
lib/metadata/raid_manip.c | 2 +-
test/shell/lvconvert-repair-raid.sh | 104 +++++++++++++++++++++++-
tools/lvconvert.c | 18 ----
6 files changed, 134 insertions(+), 39 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index faddb9f..f7b39b9 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Fix lvconvert --repair regression
Fix reported origin lv field for cache volumes. (2.02.133)
Always specify snapshot cow LV for monitoring not internal LV. (2.02.165)
Fix lvchange --discard|--zero for active thin-pool.
diff --git a/daemons/dmeventd/plugins/raid/dmeventd_raid.c b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
index 770fbc6..bec594a 100644
--- a/daemons/dmeventd/plugins/raid/dmeventd_raid.c
+++ b/daemons/dmeventd/plugins/raid/dmeventd_raid.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005-2015 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2005-2016 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
@@ -13,14 +13,20 @@
*/
#include "lib.h"
+#include "defaults.h"
#include "dmeventd_lvm.h"
#include "libdevmapper-event.h"
+/* Hold enough elements for the mximum number of RAID images */
+#define RAID_DEVS_ELEMS ((DEFAULT_RAID_MAX_IMAGES + 63) / 64)
+
struct dso_state {
struct dm_pool *mem;
char cmd_lvscan[512];
char cmd_lvconvert[512];
+ uint64_t raid_devs[RAID_DEVS_ELEMS];
int failed;
+ int warned;
};
DM_EVENT_LOG_FN("raid")
@@ -31,20 +37,39 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
{
struct dm_status_raid *status;
const char *d;
+ int dead = 0, r = 1;
if (!dm_get_status_raid(state->mem, params, &status)) {
log_error("Failed to process status line for %s.", device);
return 0;
}
- if ((d = strchr(status->dev_health, 'D'))) {
+ d = status->dev_health;
+ while ((d = strchr(d, 'D'))) {
+ uint32_t dev = (uint32_t)(d - status->dev_health);
+
+ if (!(state->raid_devs[dev / 64] & (1 << (dev % 64))))
+ log_error("Device #%u of %s array, %s, has failed.",
+ dev, status->raid_type, device);
+
+ state->raid_devs[dev / 64] |= (1 << (dev % 64));
+ d++;
+ dead = 1;
+ }
+
+ if (dead) {
+ if (status->insync_regions < status->total_regions) {
+ if (!state->warned)
+ log_warn("WARNING: waiting for resynchronization to finish "
+ "before initiating repair on RAID device %s", device);
+
+ state->warned = 1;
+ goto out; /* Not yet done syncing with accessible devices */
+ }
+
if (state->failed)
goto out; /* already reported */
- log_error("Device #%d of %s array, %s, has failed.",
- (int)(d - status->dev_health),
- status->raid_type, device);
-
state->failed = 1;
if (!dmeventd_lvm2_run_with_lock(state->cmd_lvscan))
log_warn("WARNING: Re-scan of RAID device %s failed.", device);
@@ -52,8 +77,7 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
/* if repair goes OK, report success even if lvscan has failed */
if (!dmeventd_lvm2_run_with_lock(state->cmd_lvconvert)) {
log_info("Repair of RAID device %s failed.", device);
- dm_pool_free(state->mem, status);
- return 0;
+ r = 0;
}
} else {
state->failed = 0;
@@ -64,7 +88,7 @@ static int _process_raid_event(struct dso_state *state, char *params, const char
out:
dm_pool_free(state->mem, status);
- return 1;
+ return r;
}
void process_event(struct dm_task *dmt,
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 53a1044..60374dd 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -1018,12 +1018,6 @@ int lv_raid_image_in_sync(const struct logical_volume *lv)
return 0;
}
- if (!lv_raid_percent(raid_seg->lv, &percent))
- return_0;
-
- if (percent == DM_PERCENT_100)
- return 1;
-
/* Find out which sub-LV this is. */
for (s = 0; s < raid_seg->area_count; s++)
if (seg_lv(raid_seg, s) == lv)
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index e5fdf4f..deb88a2 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -3658,7 +3658,7 @@ static int _lv_raid_rebuild_or_replace(struct logical_volume *lv,
return 0;
}
- if (!mirror_in_sync() && !_raid_in_sync(lv)) {
+ if (!_raid_in_sync(lv)) {
log_error("Unable to replace devices in %s/%s while it is"
" not in-sync.", lv->vg->name, lv->name);
return 0;
diff --git a/test/shell/lvconvert-repair-raid.sh b/test/shell/lvconvert-repair-raid.sh
index 1ef91c4..b51d8fe 100644
--- a/test/shell/lvconvert-repair-raid.sh
+++ b/test/shell/lvconvert-repair-raid.sh
@@ -22,11 +22,52 @@ aux lvmconf 'allocation/maximise_cling = 0' \
aux prepare_vg 8
+function delay
+{
+ for d in $(< DEVICES)
+ do
+ aux delay_dev "$d" 0 $1 $(get first_extent_sector "$d")
+ done
+}
+
# It's possible small raid arrays do have problems with reporting in-sync.
# So try bigger size
+RAID_SIZE=32
+
+# Fast sync and repair afterwards
+delay 0
+
+# RAID1 dual-leg single replace after initial sync
+lvcreate --type raid1 -m 1 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2"
+aux wait_for_sync $vg $lv1
+aux disable_dev "$dev2"
+lvconvert -y --repair $vg/$lv1
+vgreduce --removemissing $vg
+aux enable_dev "$dev2"
+vgextend $vg "$dev2"
+lvremove -ff $vg/$lv1
+
+# Delayed sync to allow for repair during rebuild
+delay 50
+
+# RAID1 triple-leg single replace during initial sync
+lvcreate --type raid1 -m 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
+aux disable_dev "$dev2" "$dev3"
+not lvconvert -y --repair $vg/$lv1
+aux wait_for_sync $vg $lv1
+lvconvert -y --repair $vg/$lv1
+vgreduce --removemissing $vg
+aux enable_dev "$dev2" "$dev3"
+vgextend $vg "$dev2" "$dev3"
+lvremove -ff $vg/$lv1
+
+
+# Larger RAID size possible for striped RAID
RAID_SIZE=64
-# RAID5 single replace
+# Fast sync and repair afterwards
+delay 0
+# RAID5 single replace after initial sync
lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
aux wait_for_sync $vg $lv1
aux disable_dev "$dev3"
@@ -34,16 +75,69 @@ lvconvert -y --repair $vg/$lv1
vgreduce --removemissing $vg
aux enable_dev "$dev3"
vgextend $vg "$dev3"
-lvremove -ff $vg
+lvremove -ff $vg/$lv1
-# RAID6 double replace
+# Delayed sync to allow for repair during rebuild
+delay 50
+
+# RAID5 single replace during initial sync
+lvcreate --type raid5 -i 2 -L $RAID_SIZE -n $lv1 $vg "$dev1" "$dev2" "$dev3"
+aux disable_dev "$dev3"
+not lvconvert -y --repair $vg/$lv1
+aux wait_for_sync $vg $lv1
+lvconvert -y --repair $vg/$lv1
+vgreduce --removemissing $vg
+aux enable_dev "$dev3"
+vgextend $vg "$dev3"
+lvremove -ff $vg/$lv1
+
+# Fast sync and repair afterwards
+delay 0
+
+# RAID6 double replace after initial sync
lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
"$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
aux wait_for_sync $vg $lv1
aux disable_dev "$dev4" "$dev5"
lvconvert -y --repair $vg/$lv1
vgreduce --removemissing $vg
-aux enable_dev "$dev4"
-aux enable_dev "$dev5"
+aux enable_dev "$dev4" "$dev5"
vgextend $vg "$dev4" "$dev5"
+lvremove -ff $vg/$lv1
+
+# Delayed sync to allow for repair during rebuild
+delay 50
+
+# RAID6 single replace after initial sync
+lvcreate --type raid6 -i 3 -L $RAID_SIZE -n $lv1 $vg \
+ "$dev1" "$dev2" "$dev3" "$dev4" "$dev5"
+aux disable_dev "$dev4"
+not lvconvert -y --repair $vg/$lv1
+delay 0 # Fast sync and repair afterwards
+aux disable_dev "$dev4" # Need to disable again after changing delay
+aux wait_for_sync $vg $lv1
+lvconvert -y --repair $vg/$lv1
+vgreduce --removemissing $vg
+aux enable_dev "$dev4"
+vgextend $vg "$dev4"
+lvremove -ff $vg/$lv1
+
+# Delayed sync to allow for repair during rebuild
+delay 50
+
+# RAID10 single replace after initial sync
+lvcreate --type raid10 -m 1 -i 2 -L $RAID_SIZE -n $lv1 $vg \
+ "$dev1" "$dev2" "$dev3" "$dev4"
+aux disable_dev "$dev4"
+not lvconvert -y --repair $vg/$lv1
+delay 0 # Fast sync and repair afterwards
+aux disable_dev "$dev4" # Need to disable again after changing delay
+aux disable_dev "$dev1"
+aux wait_for_sync $vg $lv1
+lvconvert -y --repair $vg/$lv1
+vgreduce --removemissing $vg
+aux enable_dev "$dev4"
+vgextend $vg "$dev4"
+lvremove -ff $vg/$lv1
+
vgremove -ff $vg
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index d1d21b6..4095101 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1974,24 +1974,6 @@ static int _lvconvert_raid(struct logical_volume *lv, struct lvconvert_params *l
return 0;
}
- if (!lv_raid_percent(lv, &sync_percent)) {
- log_error("Unable to determine sync status of %s.",
- display_lvname(lv));
- return 0;
- }
-
- if (sync_percent != DM_PERCENT_100) {
- log_warn("WARNING: %s is not in-sync.", display_lvname(lv));
- log_warn("WARNING: Portions of the array may be unrecoverable.");
-
- /*
- * The kernel will not allow a device to be replaced
- * in an array that is not in-sync unless we override
- * by forcing the array to be considered "in-sync".
- */
- init_mirror_in_sync(1);
- }
-
_lvconvert_raid_repair_ask(cmd, lp, &replace);
if (replace) {
7 years, 7 months
master - tests: correcting kernel version test
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=78e0fdb6182e8c...
Commit: 78e0fdb6182e8cae26998510760caf7afe237c39
Parent: 9f6b0062727e9ef33610880444eaee857de1ab92
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Sep 20 22:50:43 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Sep 20 22:50:43 2016 +0200
tests: correcting kernel version test
Debug force leaked in.
---
test/lib/brick-shelltest.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/test/lib/brick-shelltest.h b/test/lib/brick-shelltest.h
index 1c9a1f3..7c5b601 100644
--- a/test/lib/brick-shelltest.h
+++ b/test/lib/brick-shelltest.h
@@ -571,7 +571,7 @@ struct KMsg : Source {
// Can't use kmsg on kernels pre 3.5, read /var/log/messages
if ( ( ::uname(&uts) == 0 ) &&
( ::sscanf( uts.release, "%u.%u.%u", &kmaj, &kmin, &krel ) == 3 ) &&
- ( ( kmaj < 5 ) || ( ( kmaj == 3 ) && ( kmin < 5 ) ) ) )
+ ( ( kmaj < 3 ) || ( ( kmaj == 3 ) && ( kmin < 5 ) ) ) )
can_clear = false, read_msg = "/var/log/messages";
if ( ( fd = open(read_msg, O_RDONLY | O_NONBLOCK)) < 0 ) {
7 years, 7 months
master - tests: show some more device info
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=9f6b0062727e9e...
Commit: 9f6b0062727e9ef33610880444eaee857de1ab92
Parent: 994df22b608c40967c5327d5850af9a2a1b3eea3
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Sep 20 22:47:14 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Sep 20 22:47:14 2016 +0200
tests: show some more device info
When passdown is not there, look for possible reason.
---
test/shell/lvchange-thin.sh | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvchange-thin.sh b/test/shell/lvchange-thin.sh
index f2b33b7..f943401 100644
--- a/test/shell/lvchange-thin.sh
+++ b/test/shell/lvchange-thin.sh
@@ -29,7 +29,12 @@ lvcreate -L10M -T $vg/pool
# Check change operations on a thin-pool without any thin LV
#
# discards_ARG (default is passdown)
-check grep_dmsetup status $vg-pool " discard_passdown"
+check grep_dmsetup status $vg-pool " discard_passdown" || {
+ # trace device layout
+ grep -r "" /sys/block/*
+ die "Device was expected to support passdown"
+}
+
lvchange -vvvv --discards nopassdown $vg/pool
check grep_dmsetup table $vg-pool " no_discard_passdown"
check grep_dmsetup status $vg-pool " no_discard_passdown"
7 years, 7 months
master - tests: read messages instead of syslog
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=994df22b608c40...
Commit: 994df22b608c40967c5327d5850af9a2a1b3eea3
Parent: a9c2a62939e1c215126fa499a8ed7c0550b21f6a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Sep 20 22:36:29 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Sep 20 22:36:29 2016 +0200
tests: read messages instead of syslog
Since on those older system there is rather 'fight' over
syslog reading buffer - lets read output from /var/log/messages
intead.
---
test/lib/brick-shelltest.h | 40 +++++++++++++++++++---------------------
1 files changed, 19 insertions(+), 21 deletions(-)
diff --git a/test/lib/brick-shelltest.h b/test/lib/brick-shelltest.h
index a8df900..1c9a1f3 100644
--- a/test/lib/brick-shelltest.h
+++ b/test/lib/brick-shelltest.h
@@ -558,7 +558,6 @@ struct FileSource : Source {
struct KMsg : Source {
bool can_clear;
- bool syslog;
ssize_t buffer_size;
KMsg() : can_clear( strcmp(getenv("LVM_TEST_CAN_CLOBBER_DMESG") ? : "0", "0") ),
@@ -567,21 +566,24 @@ struct KMsg : Source {
#ifdef __unix
struct utsname uts;
unsigned kmaj, kmin, krel;
-
- // Can't use kmsg on kernels pre 3.5, relay on syslog for that case
- syslog = ( ( ::uname(&uts) == 0 ) &&
- ( ::sscanf( uts.release, "%u.%u.%u", &kmaj, &kmin, &krel ) == 3 ) &&
- ( ( kmaj < 3 ) || ( ( kmaj == 3 ) && ( kmin < 5 ) ) ) );
-
- if ( syslog )
- buffer_size = klogctl( BRICK_SYSLOG_ACTION_SIZE_BUFFER, NULL, 0 );
- else if ( (fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK)) < 0 ) {
- if (errno != ENOENT) /* Older kernels (<3.5) do not support /dev/kmsg */
- perror("opening /dev/kmsg");
- if ( klogctl( BRICK_SYSLOG_ACTION_CLEAR, 0, 0 ) < 0 )
+ const char *read_msg = "/dev/kmsg";
+
+ // Can't use kmsg on kernels pre 3.5, read /var/log/messages
+ if ( ( ::uname(&uts) == 0 ) &&
+ ( ::sscanf( uts.release, "%u.%u.%u", &kmaj, &kmin, &krel ) == 3 ) &&
+ ( ( kmaj < 5 ) || ( ( kmaj == 3 ) && ( kmin < 5 ) ) ) )
+ can_clear = false, read_msg = "/var/log/messages";
+
+ if ( ( fd = open(read_msg, O_RDONLY | O_NONBLOCK)) < 0 ) {
+ if ( errno != ENOENT ) /* Older kernels (<3.5) do not support /dev/kmsg */
+ fprintf( stderr, "open log %s %s\n", read_msg, strerror( errno ) );
+ if ( can_clear && ( klogctl( BRICK_SYSLOG_ACTION_CLEAR, 0, 0 ) < 0 ) )
can_clear = false;
- } else if (lseek(fd, 0L, SEEK_END) == (off_t) -1)
- perror("lseek /dev/kmsg");
+ } else if ( lseek( fd, 0L, SEEK_END ) == (off_t) -1 ) {
+ fprintf( stderr, "lseek log %s %s\n", read_msg, strerror( errno ) );
+ close(fd);
+ fd = -1;
+ }
#endif
}
@@ -594,16 +596,12 @@ struct KMsg : Source {
ssize_t sz;
char buf[ buffer_size ];
- if ( syslog ) {
- while ( klogctl(BRICK_SYSLOG_ACTION_SIZE_UNREAD, NULL, 0 ) > 0 &&
- ( sz = klogctl( BRICK_SYSLOG_ACTION_READ, buf, ( int ) buffer_size ) ) > 0 )
- s->push( std::string( buf, sz ) );
- } else if ( dev_kmsg() ) {
+ if ( dev_kmsg() ) {
while ( (sz = ::read(fd, buf, buffer_size)) > 0 )
s->push( std::string( buf, sz ) );
} else if ( can_clear ) {
while ( ( sz = klogctl( BRICK_SYSLOG_ACTION_READ_CLEAR, buf,
- ( int) buffer_size ) ) > 0 )
+ ( int) buffer_size ) ) > 0 )
s->push( std::string( buf, sz ) );
if ( sz < 0 && errno == EPERM )
can_clear = false;
7 years, 7 months
master - tests: kernel message for <3.5 kernels
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=a9c2a62939e1c2...
Commit: a9c2a62939e1c215126fa499a8ed7c0550b21f6a
Parent: 67d4b3b7f2be1e15af2d05faa97e8b56ddc9d668
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Sep 20 17:09:46 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Sep 20 17:09:46 2016 +0200
tests: kernel message for <3.5 kernels
Since /dev/kmsg is useless on kernel <3.5 user there automatically
syslog to obtain traces from kernel log buffer during test.
---
test/lib/brick-shelltest.h | 37 ++++++++++++++++++++++++++++++-------
test/lib/utils.sh | 1 +
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/test/lib/brick-shelltest.h b/test/lib/brick-shelltest.h
index b48253b..a8df900 100644
--- a/test/lib/brick-shelltest.h
+++ b/test/lib/brick-shelltest.h
@@ -75,6 +75,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/klog.h>
+#include <sys/utsname.h>
#include <time.h>
#include <unistd.h>
#endif
@@ -484,8 +485,12 @@ struct FileSink : FdSink {
}
};
+#define BRICK_SYSLOG_ACTION_READ 2
+#define BRICK_SYSLOG_ACTION_READ_ALL 3
#define BRICK_SYSLOG_ACTION_READ_CLEAR 4
#define BRICK_SYSLOG_ACTION_CLEAR 5
+#define BRICK_SYSLOG_ACTION_SIZE_UNREAD 9
+#define BRICK_SYSLOG_ACTION_SIZE_BUFFER 10
struct Source {
int fd;
@@ -553,10 +558,24 @@ struct FileSource : Source {
struct KMsg : Source {
bool can_clear;
+ bool syslog;
+ ssize_t buffer_size;
- KMsg() : can_clear( strcmp(getenv("LVM_TEST_CAN_CLOBBER_DMESG") ? : "0", "0") ) {
+ KMsg() : can_clear( strcmp(getenv("LVM_TEST_CAN_CLOBBER_DMESG") ? : "0", "0") ),
+ buffer_size(128 * 1024)
+ {
#ifdef __unix
- if ( (fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK)) < 0 ) {
+ struct utsname uts;
+ unsigned kmaj, kmin, krel;
+
+ // Can't use kmsg on kernels pre 3.5, relay on syslog for that case
+ syslog = ( ( ::uname(&uts) == 0 ) &&
+ ( ::sscanf( uts.release, "%u.%u.%u", &kmaj, &kmin, &krel ) == 3 ) &&
+ ( ( kmaj < 3 ) || ( ( kmaj == 3 ) && ( kmin < 5 ) ) ) );
+
+ if ( syslog )
+ buffer_size = klogctl( BRICK_SYSLOG_ACTION_SIZE_BUFFER, NULL, 0 );
+ else if ( (fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK)) < 0 ) {
if (errno != ENOENT) /* Older kernels (<3.5) do not support /dev/kmsg */
perror("opening /dev/kmsg");
if ( klogctl( BRICK_SYSLOG_ACTION_CLEAR, 0, 0 ) < 0 )
@@ -573,14 +592,18 @@ struct KMsg : Source {
void sync( Sink *s ) {
#ifdef __unix
ssize_t sz;
- char buf[ 128 * 1024 ];
+ char buf[ buffer_size ];
- if ( dev_kmsg() ) {
- while ( (sz = ::read(fd, buf, sizeof(buf) - 1)) > 0 )
+ if ( syslog ) {
+ while ( klogctl(BRICK_SYSLOG_ACTION_SIZE_UNREAD, NULL, 0 ) > 0 &&
+ ( sz = klogctl( BRICK_SYSLOG_ACTION_READ, buf, ( int ) buffer_size ) ) > 0 )
+ s->push( std::string( buf, sz ) );
+ } else if ( dev_kmsg() ) {
+ while ( (sz = ::read(fd, buf, buffer_size)) > 0 )
s->push( std::string( buf, sz ) );
} else if ( can_clear ) {
- while ( (sz = klogctl( BRICK_SYSLOG_ACTION_READ_CLEAR, buf,
- sizeof(buf) - 1 )) > 0 )
+ while ( ( sz = klogctl( BRICK_SYSLOG_ACTION_READ_CLEAR, buf,
+ ( int) buffer_size ) ) > 0 )
s->push( std::string( buf, sz ) );
if ( sz < 0 && errno == EPERM )
can_clear = false;
diff --git a/test/lib/utils.sh b/test/lib/utils.sh
index a3b5e2e..ce90cdc 100644
--- a/test/lib/utils.sh
+++ b/test/lib/utils.sh
@@ -219,6 +219,7 @@ dm_table() {
}
skip() {
+ set +vx # debug off
if test "$#" -eq 0; then
stacktrace
else
7 years, 7 months
master - cache: restore reported origin field
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=67d4b3b7f2be1e...
Commit: 67d4b3b7f2be1e15af2d05faa97e8b56ddc9d668
Parent: 414d39085c3f248601bec4cea6ce508acfa59283
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Sep 20 14:26:11 2016 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Sep 20 14:26:11 2016 +0200
cache: restore reported origin field
Commit 199697accff0658a11420e263c1f85fb74cd39d3 rerouted funtion
for priting cache volume origin to lvm2app app function - which
however had a bug. So restore the original functionality
and print correct LV as cache origin LV.
---
WHATS_NEW | 1 +
lib/metadata/lv.c | 4 ++--
test/shell/lvcreate-cache.sh | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 924d7c5..faddb9f 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Fix reported origin lv field for cache volumes. (2.02.133)
Always specify snapshot cow LV for monitoring not internal LV. (2.02.165)
Fix lvchange --discard|--zero for active thin-pool.
Enforce 4MiB or 25% metadata free space for thin pool operations.
diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
index 188a255..53a1044 100644
--- a/lib/metadata/lv.c
+++ b/lib/metadata/lv.c
@@ -537,8 +537,8 @@ struct logical_volume *lv_origin_lv(const struct logical_volume *lv)
if (lv_is_cow(lv))
origin = origin_from_cow(lv);
- else if (lv_is_cache(lv) && first_seg(lv)->origin)
- origin = first_seg(lv)->origin;
+ else if (lv_is_cache(lv) && !lv_is_pending_delete(lv))
+ origin = seg_lv(first_seg(lv), 0);
else if (lv_is_thin_volume(lv) && first_seg(lv)->origin)
origin = first_seg(lv)->origin;
else if (lv_is_thin_volume(lv) && first_seg(lv)->external_lv)
diff --git a/test/shell/lvcreate-cache.sh b/test/shell/lvcreate-cache.sh
index bed3ec2..c38549f 100644
--- a/test/shell/lvcreate-cache.sh
+++ b/test/shell/lvcreate-cache.sh
@@ -85,6 +85,7 @@ lvremove -f $vg
lvcreate --type cache-pool -L1 $vg/cpool
lvcreate -H -L4 -n $lv1 $vg/cpool
+check lv_field $vg/$lv1 origin "[${lv1}_corig]"
check lv_field $vg/$lv1 copy_percent "0.00"
# there should be something present (value differs per policy version)
test -n "$(get lv_field $vg/$lv1 data_percent)"
7 years, 7 months
master - snapshots: Fix monitoring to use cow not internal LV.
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=414d39085c3f24...
Commit: 414d39085c3f248601bec4cea6ce508acfa59283
Parent: ed37b4a62669e0e511941984c52544b3ae87589d
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Tue Sep 20 02:30:58 2016 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Tue Sep 20 02:30:58 2016 +0100
snapshots: Fix monitoring to use cow not internal LV.
---
WHATS_NEW | 1 +
lib/activate/activate.c | 7 ++++---
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index ebb9c8c..924d7c5 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.166 -
=====================================
+ Always specify snapshot cow LV for monitoring not internal LV. (2.02.165)
Fix lvchange --discard|--zero for active thin-pool.
Enforce 4MiB or 25% metadata free space for thin pool operations.
Fix lock-holder device for thin pool with inactive thin volumes.
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 69d40a0..5550955 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -1774,7 +1774,8 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
/*
* In case this LV is a snapshot origin, we instead monitor
* each of its respective snapshots. The origin itself may
- * also need to be monitored if it is a mirror, for example.
+ * also need to be monitored if it is a mirror, for example,
+ * so fall through to process it afterwards.
*/
if (!laopts->origin_only && lv_is_origin(lv))
dm_list_iterate_safe(snh, snht, &lv->snapshot_segs)
@@ -1835,7 +1836,7 @@ int monitor_dev_for_events(struct cmd_context *cmd, const struct logical_volume
if (!monitor)
/* When unmonitoring, obtain existing dso being used. */
- monitored = _device_registered_with_dmeventd(cmd, seg->lv, &pending, &dso);
+ monitored = _device_registered_with_dmeventd(cmd, seg_is_snapshot(seg) ? seg->cow : seg->lv, &pending, &dso);
else
monitored = seg->segtype->ops->target_monitored(seg, &pending);
@@ -1870,7 +1871,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, 10)) {
+ if (!target_register_events(cmd, dso, seg_is_snapshot(seg) ? seg->cow : lv, 0, 0, 10)) {
log_error("%s: segment unmonitoring failed.",
display_lvname(lv));
7 years, 7 months