From 3a042496fd0839fd86ba3bbcb9a583a2ecd39666 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 11 May 2012 22:19:12 +0000 Subject: [PATCH] Fix allocation policy loop so it doesn't continue beyond cling using later policies it shouldn't be using when --alloc cling is specified but no tags are defined. --- WHATS_NEW | 1 + lib/metadata/lv_manip.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 6ee8eef4a..68ab3af31 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.96 - ================================ + Fix policy loop not to use later policies when --alloc cling without tags. Append _TO_LVSEG to names of internal A_CONTIGUOUS and A_CLING flags. Add missing pkg init --with-systemdsystemunitdir in configure.in (2.02.92). Fix division by zero if PV with zero PE count is used during vgcfgrestore. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index adc5e896e..25d20af81 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -2022,7 +2022,7 @@ static int _allocate(struct alloc_handle *ah, ah->alloc = ALLOC_CLING_BY_TAGS; /* Attempt each defined allocation policy in turn */ - for (alloc = ALLOC_CONTIGUOUS; alloc < ALLOC_INHERIT; alloc++) { + for (alloc = ALLOC_CONTIGUOUS; alloc <= ah->alloc; alloc++) { /* Skip cling_by_tags if no list defined */ if (alloc == ALLOC_CLING_BY_TAGS && !ah->cling_tag_list_cn) continue; @@ -2039,7 +2039,7 @@ static int _allocate(struct alloc_handle *ah, if (!_find_max_parallel_space_for_one_policy(ah, &alloc_parms, pvms, &alloc_state)) goto_out; - if ((alloc_state.allocated == ah->new_extents && !alloc_state.log_area_count_still_needed) || (ah->alloc == alloc) || + if ((alloc_state.allocated == ah->new_extents && !alloc_state.log_area_count_still_needed) || (!can_split && (alloc_state.allocated != old_allocated))) break; } @@ -2154,7 +2154,7 @@ struct alloc_handle *allocate_extents(struct volume_group *vg, return NULL; } - if (alloc == ALLOC_INHERIT) + if (alloc >= ALLOC_INHERIT) alloc = vg->alloc; new_extents = (lv ? lv->le_count : 0) + extents;