summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-07-12 17:20:38 +0200
committerHeinz Mauelshagen <heinzm@redhat.com>2016-07-12 17:23:05 +0200
commitc77c59f3d9a97b43cd2bd9be1c5892aea384f857 (patch)
tree1556d67f39ab8dad1f8b528f47337661acfb9fdd
parentdcbcc65dc2177c55c4a7286e6e95d9a740c731c7 (diff)
downloadlvm2-c77c59f3d9a97b43cd2bd9be1c5892aea384f857.tar.gz
lvchange: resync attempts on raid0 cause segfaults
Resync attempts on raid0/raid0_meta via 'lvchange --resync ...' cause segfaults. 'lvchange --syncaction ...' doesn't get rejected either. Prohibit both on raid0/raid0_meta LVs. - resolves rhbz1354656
-rw-r--r--tools/lvchange.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/tools/lvchange.c b/tools/lvchange.c
index c5461f9f1..4b02ba951 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -326,8 +326,9 @@ static int _lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
dm_list_init(&device_list);
- if (!seg_is_mirror(seg) && !seg_is_raid(seg)) {
- log_error("Unable to resync %s. It is not RAID or mirrored.",
+ if (seg_is_any_raid0(seg) ||
+ (!seg_is_mirror(seg) && !seg_is_raid(seg))) {
+ log_error("Unable to resync %s. It is not RAID4/5/6/10 or mirrored.",
display_lvname(lv));
return 0;
}
@@ -1179,9 +1180,17 @@ static int _lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
!_lvchange_resync(cmd, lv))
return_ECMD_FAILED;
- if (arg_is_set(cmd, syncaction_ARG) &&
- !lv_raid_message(lv, arg_str_value(cmd, syncaction_ARG, NULL)))
- return_ECMD_FAILED;
+ if (arg_is_set(cmd, syncaction_ARG)) {
+ struct lv_segment *seg = first_seg(lv);
+
+ if (seg_is_any_raid0(seg)) {
+ log_error("Unable to sync raid0 LV %s.", display_lvname(lv));
+ return_ECMD_FAILED;
+ }
+
+ if (!lv_raid_message(lv, arg_str_value(cmd, syncaction_ARG, NULL)))
+ return_ECMD_FAILED;
+ }
/* activation change */
if (arg_is_set(cmd, activate_ARG)) {