From: agk@sourceware.org <agk@sourceware.org>
To: lvm-devel@redhat.com
Subject: LVM2 lib/metadata/lv_manip.c ./WHATS_NEW
Date: 11 May 2012 22:53:15 -0000 [thread overview]
Message-ID: <20120511225315.8465.qmail@sourceware.org> (raw)
CVSROOT: /cvs/lvm2
Module name: LVM2
Changes by: agk at sourceware.org 2012-05-11 22:53:13
Modified files:
lib/metadata : lv_manip.c
. : WHATS_NEW
Log message:
Fix cling policy not to behave like normal policy if no previous LV seg.
Fix alloc cling to cling to PVs already found with contiguous policy.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.379&r2=1.380
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.2403&r2=1.2404
--- LVM2/lib/metadata/lv_manip.c 2012/05/11 22:19:12 1.379
+++ LVM2/lib/metadata/lv_manip.c 2012/05/11 22:53:13 1.380
@@ -910,13 +910,18 @@
if (alloc_parms->prev_lvseg) {
if (alloc_parms->alloc == ALLOC_CONTIGUOUS)
alloc_parms->flags |= A_CONTIGUOUS_TO_LVSEG;
- else if (alloc_parms->alloc == ALLOC_CLING)
+ else if ((alloc_parms->alloc == ALLOC_CLING) || (alloc_parms->alloc == ALLOC_CLING_BY_TAGS))
alloc_parms->flags |= A_CLING_TO_LVSEG;
- else if (alloc_parms->alloc == ALLOC_CLING_BY_TAGS) {
- alloc_parms->flags |= A_CLING_TO_LVSEG;
- alloc_parms->flags |= A_CLING_BY_TAGS;
- }
- }
+ } else
+ /*
+ * A cling allocation that follows a successful contiguous allocation
+ * must use the same PVs (or else fail).
+ */
+ if ((alloc_parms->alloc == ALLOC_CLING) || (alloc_parms->alloc == ALLOC_CLING_BY_TAGS))
+ alloc_parms->flags |= A_CLING_TO_ALLOCED;
+
+ if (alloc_parms->alloc == ALLOC_CLING_BY_TAGS)
+ alloc_parms->flags |= A_CLING_BY_TAGS;
/*
* For normal allocations, if any extents have already been found
@@ -1435,7 +1440,8 @@
/*
* Is pva on same PV as any areas already used in this allocation attempt?
*/
-static int _check_cling_to_alloced(struct alloc_handle *ah, struct pv_area *pva, struct alloc_state *alloc_state)
+static int _check_cling_to_alloced(struct alloc_handle *ah, const struct dm_config_node *cling_tag_list_cn,
+ struct pv_area *pva, struct alloc_state *alloc_state)
{
unsigned s;
struct alloced_area *aa;
@@ -1451,7 +1457,8 @@
if (alloc_state->areas[s].pva)
continue; /* Area already assigned */
dm_list_iterate_items(aa, &ah->alloced_areas[s]) {
- if (pva->map->pv == aa[0].pv) {
+ if ((!cling_tag_list_cn && (pva->map->pv == aa[0].pv)) ||
+ (cling_tag_list_cn && _pvs_have_matching_tag(cling_tag_list_cn, pva->map->pv, aa[0].pv))) {
_reserve_area(&alloc_state->areas[s], pva, pva->count, s + 1, 0);
return 1;
}
@@ -1505,29 +1512,28 @@
/* Try next area on same PV if looking for contiguous space */
if (alloc_parms->flags & A_CONTIGUOUS_TO_LVSEG)
return NEXT_AREA;
-
- /* Cling_to_alloced? */
- if ((alloc_parms->flags & A_CLING_TO_ALLOCED) &&
- _check_cling_to_alloced(ah, pva, alloc_state))
- return PREFERRED;
- /* Cling? */
- if (!(alloc_parms->flags & A_CLING_BY_TAGS) &&
- alloc_parms->prev_lvseg && _check_cling(ah, NULL, alloc_parms->prev_lvseg, pva, alloc_state))
+ /* Cling to prev_lvseg? */
+ if (((alloc_parms->flags & A_CLING_TO_LVSEG) || (ah->maximise_cling && alloc_parms->prev_lvseg)) &&
+ _check_cling(ah, NULL, alloc_parms->prev_lvseg, pva, alloc_state))
/* If this PV is suitable, use this first area */
return PREFERRED;
- if (!ah->maximise_cling && !(alloc_parms->flags & A_CLING_BY_TAGS))
- return NEXT_PV;
+ /* Cling_to_alloced? */
+ if ((alloc_parms->flags & A_CLING_TO_ALLOCED) &&
+ _check_cling_to_alloced(ah, NULL, pva, alloc_state))
+ return PREFERRED;
/* Cling_by_tags? */
- if ((alloc_parms->flags & (A_CLING_BY_TAGS | A_CLING_TO_ALLOCED)) && ah->cling_tag_list_cn &&
- alloc_parms->prev_lvseg && _check_cling(ah, ah->cling_tag_list_cn, alloc_parms->prev_lvseg, pva, alloc_state))
- return PREFERRED;
-
- if (alloc_parms->flags & A_CLING_BY_TAGS)
+ if (!(alloc_parms->flags & A_CLING_BY_TAGS) || !ah->cling_tag_list_cn)
return NEXT_PV;
+ if (alloc_parms->prev_lvseg) {
+ if (_check_cling(ah, ah->cling_tag_list_cn, alloc_parms->prev_lvseg, pva, alloc_state))
+ return PREFERRED;
+ } else if (_check_cling_to_alloced(ah, ah->cling_tag_list_cn, pva, alloc_state))
+ return PREFERRED;
+
/* All areas on this PV give same result so pointless checking more */
return NEXT_PV;
}
@@ -1669,6 +1675,7 @@
uint32_t devices_needed = ah->area_count + ah->parity_count;
/* ix_offset holds the number of parallel allocations that must be contiguous/cling */
+ /* At most one of A_CONTIGUOUS_TO_LVSEG, A_CLING_TO_LVSEG or A_CLING_TO_ALLOCED may be set */
if (alloc_parms->flags & (A_CONTIGUOUS_TO_LVSEG | A_CLING_TO_LVSEG))
ix_offset = _stripes_per_mimage(alloc_parms->prev_lvseg) * alloc_parms->prev_lvseg->area_count;
@@ -1791,7 +1798,7 @@
break;
}
} while ((alloc_parms->alloc == ALLOC_ANYWHERE && last_ix != ix && ix < devices_needed + alloc_state->log_area_count_still_needed) ||
- /* With cling_to_alloced, if there were gaps in the preferred areas, have a second iteration */
+ /* With cling_to_alloced and normal, if there were gaps in the preferred areas, have a second iteration */
(alloc_parms->alloc == ALLOC_NORMAL && preferred_count &&
(preferred_count < ix_offset || alloc_state->log_area_count_still_needed) &&
(alloc_parms->flags & A_CLING_TO_ALLOCED) && !iteration_count++) ||
@@ -1920,7 +1927,7 @@
return_0;
/*
- * If we didn't allocate anything this time and had
+ * If we didn't allocate anything this time with ALLOC_NORMAL and had
* A_CLING_TO_ALLOCED set, try again without it.
*
* For ALLOC_NORMAL, if we did allocate something without the
@@ -1928,7 +1935,7 @@
* remain on the same disks where possible.
*/
if (old_allocated == alloc_state->allocated) {
- if (alloc_parms->flags & A_CLING_TO_ALLOCED)
+ if ((alloc_parms->alloc == ALLOC_NORMAL) && (alloc_parms->flags & A_CLING_TO_ALLOCED))
alloc_parms->flags &= ~A_CLING_TO_ALLOCED;
else
break; /* Give up */
--- LVM2/WHATS_NEW 2012/05/11 22:19:12 1.2403
+++ LVM2/WHATS_NEW 2012/05/11 22:53:13 1.2404
@@ -1,6 +1,8 @@
Version 2.02.96 -
================================
- Fix policy loop not to use later policies when --alloc cling without tags.
+ Fix alloc cling to cling to PVs already found with contiguous policy.
+ Fix cling policy not to behave like normal policy if no previous LV seg.
+ Fix allocation 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.
next reply other threads:[~2012-05-11 22:53 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-11 22:53 agk [this message]
-- strict thread matches above, loose matches on Subject: below --
2012-05-14 16:18 LVM2 lib/metadata/lv_manip.c ./WHATS_NEW agk
2011-11-04 1:31 agk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120511225315.8465.qmail@sourceware.org \
--to=agk@sourceware.org \
--cc=lvm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.