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:
parent
a16f48e31a
commit
6c48fe7433
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user