From 3964a1a89f52584878c09cf93bc971b96c0d3de1 Mon Sep 17 00:00:00 2001 From: Jonathan Brassow Date: Thu, 19 Jun 2014 10:52:09 -0500 Subject: [PATCH] pvmove: Clean-up iterator. In 'find_pvmove_lv', separate the code that searches the atomic pvmove LVs from the code that searches the normal pvmove LVs. This cleans up the segment iterator code a bit. --- lib/metadata/mirror.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c index ca0c2a16b..484b1f187 100644 --- a/lib/metadata/mirror.c +++ b/lib/metadata/mirror.c @@ -1559,14 +1559,29 @@ struct logical_volume *find_pvmove_lv(struct volume_group *vg, if (!(lv->status & lv_type)) continue; - /* Check segment origins point to pvname */ + /* + * If this is an atomic pvmove, the first + * segment will be a mirror containing + * mimages (i.e. AREA_LVs) + */ + if (seg_type(first_seg(lv), 0) == AREA_LV) { + seg = first_seg(lv); /* the mirror segment */ + seg = first_seg(seg_lv(seg, 0)); /* mimage_0 segment0 */ + if (seg_dev(seg, 0) != dev) + continue; + return lv; + } + + /* + * If this is a normal pvmove, check all the segments' + * first areas for the requested device + */ dm_list_iterate_items(seg, &lv->segments) { - if (seg_type(seg, 0) == AREA_LV) /* Atomic pvmove */ - seg = first_seg(seg_lv(seg, 0)); - if (seg_type(seg, 0) != AREA_PV) /* Segment pvmove */ + if (seg_type(seg, 0) != AREA_PV) continue; if (seg_dev(seg, 0) != dev) continue; + return lv; } }