return lv_mirror_count(log_lv);
}
+static int _lv_update_mirrored_log(struct logical_volume *lv,
+ struct dm_list *operable_pvs,
+ int log_count)
+{
+ int old_log_count;
+ struct logical_volume *log_lv;
+
+ log_lv = first_seg(_original_lv(lv))->log_lv;
+ if (!log_lv || !(log_lv->status & MIRRORED))
+ return 1;
+
+ old_log_count = _get_log_count(lv);
+ if (old_log_count == log_count)
+ return 1;
+
+ /* Reducing redundancy of the log */
+ return remove_mirror_images(log_lv, log_count,
+ is_mirror_image_removable,
+ operable_pvs, 0U);
+}
+
static int _lv_update_log_type(struct cmd_context *cmd,
struct lvconvert_params *lp,
struct logical_volume *lv,
* We must adjust the log first, or the entire mirror
* will get stuck during a suspend.
*/
- if (!_lv_update_log_type(cmd, lp, lv, failed_pvs, new_log_count))
+ if (!_lv_update_mirrored_log(lv, failed_pvs, new_log_count))
return 0;
+ if (lp->mirrors == 1)
+ new_log_count = 0;
+
if (failed_mirrors) {
- if (!lv_remove_mirrors(cmd, lv, failed_mirrors, new_log_count,
+ if (!lv_remove_mirrors(cmd, lv, failed_mirrors,
+ new_log_count ? 0U : 1U,
_is_partial_lv, NULL, 0))
return 0;
}
+ if (!_lv_update_log_type(cmd, lp, lv, failed_pvs,
+ new_log_count))
+ return 0;
+
if (!_reload_lv(cmd, lv))
return 0;