From 876003dc44d92661773b1175768dd892b6d8bf87 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Wed, 16 Jan 2008 19:18:51 +0000 Subject: [PATCH] allow a mirror to contain only one mimage --- lib/activate/activate.c | 7 +++++++ lib/metadata/mirror.c | 2 +- lib/mirror/mirrored.c | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 30fdaa475..785d3bb22 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -508,6 +508,13 @@ int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv, struct dev_manager *dm; struct lvinfo info; + /* If mirrored LV is temporarily shrinked to 1 area (= linear), + * it should be considered in-sync. */ + if (list_size(&lv->segments) == 1 && first_seg(lv)->area_count == 1) { + *percent = 100.0; + return 1; + } + if (!activation()) return 0; diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index be9e7ae78..21e00b945 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -956,7 +956,7 @@ float copy_percent(struct logical_volume *lv_mirr) list_iterate_items(seg, &lv_mirr->segments) { denominator += seg->area_len; - if (seg_is_mirrored(seg)) + if (seg_is_mirrored(seg) && seg->area_count > 1) numerator += seg->extents_copied; else numerator += seg->area_len; diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c index 3a3df3316..917d0391a 100644 --- a/lib/mirror/mirrored.c +++ b/lib/mirror/mirrored.c @@ -283,6 +283,11 @@ static int _mirrored_add_target_line(struct dev_manager *dm, struct dm_pool *mem mirr_state = *target_state; + /* Mirror segment could have only 1 area temporarily, + * if the segment is under conversion. */ + if (seg->area_count == 1) + mirror_status = MIRR_DISABLED; + /* * For pvmove, only have one mirror segment RUNNING at once. * Segments before this are COMPLETED and use 2nd area.