diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2016-07-12 17:20:38 +0200 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2016-07-12 17:23:05 +0200 |
commit | c77c59f3d9a97b43cd2bd9be1c5892aea384f857 (patch) | |
tree | 1556d67f39ab8dad1f8b528f47337661acfb9fdd | |
parent | dcbcc65dc2177c55c4a7286e6e95d9a740c731c7 (diff) | |
download | lvm2-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.c | 19 |
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)) { |