1
0
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:
Alasdair Kergon 2008-06-26 23:05:11 +00:00
parent 0383c4e1d8
commit b0dc94d187
3 changed files with 37 additions and 9 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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,