mirror of
git://sourceware.org/git/lvm2.git
synced 2025-02-04 21:47:46 +03:00
Update validation of safe mirror log type conversions in lvconvert. (brassow)
This commit is contained in:
parent
0383c4e1d8
commit
b0dc94d187
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.39 -
|
Version 2.02.39 -
|
||||||
================================
|
================================
|
||||||
|
Update validation of safe mirror log type conversions in lvconvert.
|
||||||
Fix lvconvert to disallow snapshot and mirror combinations.
|
Fix lvconvert to disallow snapshot and mirror combinations.
|
||||||
Fix reporting of LV fields alongside unallocated PV segments.
|
Fix reporting of LV fields alongside unallocated PV segments.
|
||||||
Add --unquoted and --rows to reporting tools.
|
Add --unquoted and --rows to reporting tools.
|
||||||
|
@ -1140,6 +1140,8 @@ int remove_mirror_log(struct cmd_context *cmd,
|
|||||||
struct list *removable_pvs)
|
struct list *removable_pvs)
|
||||||
{
|
{
|
||||||
float sync_percent;
|
float sync_percent;
|
||||||
|
struct lvinfo info;
|
||||||
|
struct volume_group *vg = lv->vg;
|
||||||
|
|
||||||
/* Unimplemented features */
|
/* Unimplemented features */
|
||||||
if (list_size(&lv->segments) != 1) {
|
if (list_size(&lv->segments) != 1) {
|
||||||
@ -1148,10 +1150,21 @@ int remove_mirror_log(struct cmd_context *cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Had disk log, switch to core. */
|
/* Had disk log, switch to core. */
|
||||||
if (!lv_mirror_percent(cmd, lv, 0, &sync_percent, NULL)) {
|
if (lv_info(cmd, lv, &info, 0, 0) && info.exists) {
|
||||||
log_error("Unable to determine mirror sync status.");
|
if (!lv_mirror_percent(cmd, lv, 0, &sync_percent, NULL)) {
|
||||||
|
log_error("Unable to determine mirror sync status.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (vg_is_clustered(vg)) {
|
||||||
|
log_error("Unable to convert the log of inactive "
|
||||||
|
"cluster mirror %s", lv->name);
|
||||||
|
return 0;
|
||||||
|
} else if (yes_no_prompt("Full resync required to convert "
|
||||||
|
"inactive mirror %s to core log. "
|
||||||
|
"Proceed? [y/n]: "))
|
||||||
|
sync_percent = 0;
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (sync_percent >= 100.0)
|
if (sync_percent >= 100.0)
|
||||||
init_mirror_in_sync(1);
|
init_mirror_in_sync(1);
|
||||||
@ -1269,12 +1282,9 @@ int attach_mirror_log(struct lv_segment *seg, struct logical_volume *log_lv)
|
|||||||
return add_seg_to_segs_using_this_lv(log_lv, seg);
|
return add_seg_to_segs_using_this_lv(log_lv, seg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int add_mirror_log(struct cmd_context *cmd,
|
int add_mirror_log(struct cmd_context *cmd, struct logical_volume *lv,
|
||||||
struct logical_volume *lv,
|
uint32_t log_count, uint32_t region_size,
|
||||||
uint32_t log_count,
|
struct list *allocatable_pvs, alloc_policy_t alloc)
|
||||||
uint32_t region_size,
|
|
||||||
struct list *allocatable_pvs,
|
|
||||||
alloc_policy_t alloc)
|
|
||||||
{
|
{
|
||||||
struct alloc_handle *ah;
|
struct alloc_handle *ah;
|
||||||
const struct segment_type *segtype;
|
const struct segment_type *segtype;
|
||||||
@ -1282,17 +1292,31 @@ int add_mirror_log(struct cmd_context *cmd,
|
|||||||
float sync_percent;
|
float sync_percent;
|
||||||
int in_sync;
|
int in_sync;
|
||||||
struct logical_volume *log_lv;
|
struct logical_volume *log_lv;
|
||||||
|
struct lvinfo info;
|
||||||
|
|
||||||
/* Unimplemented features */
|
/* Unimplemented features */
|
||||||
if (log_count > 1) {
|
if (log_count > 1) {
|
||||||
log_error("log_count > 1 is not supported");
|
log_error("log_count > 1 is not supported");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list_size(&lv->segments) != 1) {
|
if (list_size(&lv->segments) != 1) {
|
||||||
log_error("Multiple-segment mirror is not supported");
|
log_error("Multiple-segment mirror is not supported");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We are unable to convert the log of inactive cluster mirrors
|
||||||
|
* due to the inability to detect whether the mirror is active
|
||||||
|
* on remote nodes (even though it is inactive on this node)
|
||||||
|
*/
|
||||||
|
if (vg_is_clustered(lv->vg) &&
|
||||||
|
!(lv_info(cmd, lv, &info, 0, 0) && info.exists)) {
|
||||||
|
log_error("Unable to convert the log of inactive "
|
||||||
|
"cluster mirror %s", lv->name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
|
if (!(parallel_areas = build_parallel_areas_from_lv(cmd, lv)))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
|
@ -508,6 +508,9 @@ static int lvconvert_mirrors(struct cmd_context * cmd, struct logical_volume * l
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lp->mirrors == existing_mirrors) {
|
if (lp->mirrors == existing_mirrors) {
|
||||||
|
/*
|
||||||
|
* Convert Mirror log type
|
||||||
|
*/
|
||||||
original_lv = _original_lv(lv);
|
original_lv = _original_lv(lv);
|
||||||
if (!first_seg(original_lv)->log_lv && !corelog) {
|
if (!first_seg(original_lv)->log_lv && !corelog) {
|
||||||
if (!add_mirror_log(cmd, original_lv, 1,
|
if (!add_mirror_log(cmd, original_lv, 1,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user