From a7d355a28cb55ede3bfbbbd869c4943fc4b5873a Mon Sep 17 00:00:00 2001 From: Jonathan Earl Brassow Date: Mon, 21 Jun 2010 16:12:33 +0000 Subject: [PATCH] Mirrors can be layered - as in the case of an converting 2-way to 3-way mirror. When conversion operations are performed on these types of mirrors, log options can be confused/ignored. In the case of a converting 3-way mirror, we have a top-level 2-way corelog mirror whose legs are 1) a 2-way disk-log mirror and 2) a linear device. If we wish to convert this 3-way mirror to a 2-way mirror, the linear device is removed and the extra top layer is eliminated. If we also wished to convert the disk log to a core log in the same step, ambiguity creeps in. It is somewhat obvious what the user wants - a 2-way mirror with a corelog. However, looking at the top level mirror before compression, it seems that the mirror already has a core log. This is why the operation seemed to fail. This patch simply re-evaluates what mirrored_seg points to after a compression and then considers the log argument. This is a fix for bug 599898. --- WHATS_NEW | 1 + lib/metadata/mirror.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/WHATS_NEW b/WHATS_NEW index e5abcb18a..cb57ed3c0 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.68 - =============================== + Honor log argument when down-converting stacked mirror. Sleep to workaround clvmd -S race: socket closed early and server drops cmd. Use early udev synchronisation and update of dev nodes for clustered mirrors. Remove incorrect inclusion of kdev_t.h from cmirrord/functions.h. diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index 11777c0ed..50082578b 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -851,6 +851,9 @@ static int _remove_mirror_images(struct logical_volume *lv, log_error("Failed to add mirror images"); return 0; } + mirrored_seg = first_seg(lv); + if (remove_log && !detached_log_lv) + detached_log_lv = detach_mirror_log(mirrored_seg); } else if (new_area_count == 0) { log_very_verbose("All mimages of %s are gone", lv->name); -- 2.43.5