1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Fix mirror segment removal to use temporary error segment.

This commit is contained in:
Alasdair Kergon 2006-11-30 17:52:47 +00:00
parent a16f48e31a
commit 6c48fe7433
2 changed files with 8 additions and 2 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.16 - Version 2.02.16 -
==================================== ====================================
Fix mirror segment removal to use temporary error segment.
Always compile debug logging into clvmd. Always compile debug logging into clvmd.
Add startup timeout to RHEL4 clvmd startup script. Add startup timeout to RHEL4 clvmd startup script.
Add -T (startup timeout) switch to clvmd. Add -T (startup timeout) switch to clvmd.

View File

@ -84,6 +84,7 @@ int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
struct list *removable_pvs, int remove_log) struct list *removable_pvs, int remove_log)
{ {
uint32_t m; uint32_t m;
uint32_t extents;
uint32_t s, s1; uint32_t s, s1;
struct logical_volume *sub_lv; struct logical_volume *sub_lv;
struct logical_volume *log_lv = NULL; struct logical_volume *log_lv = NULL;
@ -95,6 +96,7 @@ int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
struct pv_list *pvl; struct pv_list *pvl;
uint32_t old_area_count = mirrored_seg->area_count; uint32_t old_area_count = mirrored_seg->area_count;
uint32_t new_area_count = mirrored_seg->area_count; uint32_t new_area_count = mirrored_seg->area_count;
struct segment_type *segtype;
log_very_verbose("Reducing mirror set from %" PRIu32 " to %" log_very_verbose("Reducing mirror set from %" PRIu32 " to %"
PRIu32 " image(s)%s.", PRIu32 " image(s)%s.",
@ -156,9 +158,14 @@ int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
/* If no more mirrors, remove mirror layer */ /* If no more mirrors, remove mirror layer */
if (num_mirrors == 1) { if (num_mirrors == 1) {
lv1 = seg_lv(mirrored_seg, 0); lv1 = seg_lv(mirrored_seg, 0);
extents = lv1->le_count;
_move_lv_segments(mirrored_seg->lv, lv1); _move_lv_segments(mirrored_seg->lv, lv1);
mirrored_seg->lv->status &= ~MIRRORED; mirrored_seg->lv->status &= ~MIRRORED;
remove_log = 1; remove_log = 1;
/* Replace mirror with error segment */
segtype = get_segtype_from_string(mirrored_seg->lv->vg->cmd, "error");
if (!lv_add_virtual_segment(lv1, 0, extents, segtype))
return_0;
} }
if (remove_log && mirrored_seg->log_lv) { if (remove_log && mirrored_seg->log_lv) {
@ -174,8 +181,6 @@ int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors,
* then deactivate and remove them fully. * then deactivate and remove them fully.
*/ */
/* FIXME lv1 has no segments here so shouldn't be written to disk! */
if (!vg_write(mirrored_seg->lv->vg)) { if (!vg_write(mirrored_seg->lv->vg)) {
log_error("intermediate VG write failed."); log_error("intermediate VG write failed.");
return 0; return 0;