1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

Disable the "new pe_start policy"

Documented which use-cases force the reinstatement of the nuanced
handling of pe_start.  As soon as orphan PVs are eliminated much of this
will no longer be a concern ('preserve_pe_start' can be reenabled in
.pv_setup).

Added defensive 'if (pv->pe_align)' check in _text_pv_write()'s pe_start
loop.
This commit is contained in:
Mike Snitzer 2009-07-30 21:15:17 +00:00
parent 733bd656b2
commit 377b6a5843
2 changed files with 46 additions and 13 deletions

View File

@ -1,9 +1,7 @@
Version 2.02.51 - Version 2.02.51 -
================================ ================================
Add --dataalignmentoffset to pvcreate to shift start of aligned data area. Add --dataalignmentoffset to pvcreate to shift start of aligned data area.
Preserve pe_start in .pv_write if pe_start was supplied.
Fix _mda_setup() to not check first mda's size before pe_align rounding. Fix _mda_setup() to not check first mda's size before pe_align rounding.
Formalize pe_start policy as split between .pv_setup and .pv_write.
Document -I option of clvmd in the man page. Document -I option of clvmd in the man page.
Fix configure script to handle multiple clvmd selections. Fix configure script to handle multiple clvmd selections.
Fix lvm2app.pc installation filename. Fix lvm2app.pc installation filename.

View File

@ -1337,6 +1337,7 @@ static int _text_pv_write(const struct format_type *fmt, struct physical_volume
char buf[MDA_HEADER_SIZE] __attribute((aligned(8))); char buf[MDA_HEADER_SIZE] __attribute((aligned(8)));
struct mda_header *mdah = (struct mda_header *) buf; struct mda_header *mdah = (struct mda_header *) buf;
uint64_t adjustment; uint64_t adjustment;
struct data_area_list *da;
/* FIXME Test mode don't update cache? */ /* FIXME Test mode don't update cache? */
@ -1373,24 +1374,42 @@ static int _text_pv_write(const struct format_type *fmt, struct physical_volume
dm_list_init(&info->mdas); dm_list_init(&info->mdas);
} }
if (info->das.n) /*
* If no pe_start supplied but PV already exists,
* get existing value; use-cases include:
* - pvcreate on PV without prior pvremove
* - vgremove on VG with PV(s) that have pe_start=0 (hacked cfg)
*/
if (info->das.n) {
if (!pv->pe_start)
dm_list_iterate_items(da, &info->das)
pv->pe_start = da->disk_locn.offset >> SECTOR_SHIFT;
del_das(&info->das); del_das(&info->das);
else } else
dm_list_init(&info->das); dm_list_init(&info->das);
#if 0
/*
* FIXME: ideally a pre-existing pe_start seen in .pv_write
* would always be preserved BUT 'pvcreate on PV without prior pvremove'
* could easily cause the pe_start to overlap with the first mda!
*/
if (pv->pe_start) { if (pv->pe_start) {
log_very_verbose("%s: preserving pe_start=%lu", log_very_verbose("%s: preserving pe_start=%lu",
pv_dev_name(pv), pv->pe_start); pv_dev_name(pv), pv->pe_start);
goto preserve_pe_start; goto preserve_pe_start;
} }
#endif
/* /*
* If pe_start is still unset, set it to first aligned * If pe_start is still unset, set it to first aligned
* sector after any metadata areas that begin before pe_start. * sector after any metadata areas that begin before pe_start.
*/ */
pv->pe_start = pv->pe_align; if (!pv->pe_start) {
if (pv->pe_align_offset) pv->pe_start = pv->pe_align;
pv->pe_start += pv->pe_align_offset; if (pv->pe_align_offset)
pv->pe_start += pv->pe_align_offset;
}
dm_list_iterate_items(mda, &info->mdas) { dm_list_iterate_items(mda, &info->mdas) {
mdac = (struct mda_context *) mda->metadata_locn; mdac = (struct mda_context *) mda->metadata_locn;
if (pv->dev == mdac->area.dev && if (pv->dev == mdac->area.dev &&
@ -1402,11 +1421,14 @@ static int _text_pv_write(const struct format_type *fmt, struct physical_volume
pv->pe_start = (mdac->area.start + mdac->area.size) pv->pe_start = (mdac->area.start + mdac->area.size)
>> SECTOR_SHIFT; >> SECTOR_SHIFT;
/* Adjust pe_start to: (N * pe_align) + pe_align_offset */ /* Adjust pe_start to: (N * pe_align) + pe_align_offset */
adjustment = if (pv->pe_align) {
adjustment =
(pv->pe_start - pv->pe_align_offset) % pv->pe_align; (pv->pe_start - pv->pe_align_offset) % pv->pe_align;
if (adjustment) if (adjustment)
pv->pe_start += pv->pe_align - adjustment; pv->pe_start += pv->pe_align - adjustment;
log_very_verbose("%s: setting pe_start=%lu (orig_pe_start=%lu, "
log_very_verbose("%s: setting pe_start=%lu "
"(orig_pe_start=%lu, "
"pe_align=%lu, pe_align_offset=%lu, " "pe_align=%lu, pe_align_offset=%lu, "
"adjustment=%" PRIu64 ")", "adjustment=%" PRIu64 ")",
pv_dev_name(pv), pv->pe_start, pv_dev_name(pv), pv->pe_start,
@ -1414,6 +1436,7 @@ static int _text_pv_write(const struct format_type *fmt, struct physical_volume
pv->pe_start -= pv->pe_align - adjustment : pv->pe_start -= pv->pe_align - adjustment :
pv->pe_start), pv->pe_start),
pv->pe_align, pv->pe_align_offset, adjustment); pv->pe_align, pv->pe_align_offset, adjustment);
}
} }
} }
if (pv->pe_start >= pv->size) { if (pv->pe_start >= pv->size) {
@ -1422,7 +1445,7 @@ static int _text_pv_write(const struct format_type *fmt, struct physical_volume
return 0; return 0;
} }
preserve_pe_start: /* FIXME: preserve_pe_start: */
if (!add_da if (!add_da
(NULL, &info->das, pv->pe_start << SECTOR_SHIFT, UINT64_C(0))) (NULL, &info->das, pv->pe_start << SECTOR_SHIFT, UINT64_C(0)))
return_0; return_0;
@ -1635,7 +1658,7 @@ static struct metadata_area_ops _metadata_text_raw_ops = {
/* pvmetadatasize in sectors */ /* pvmetadatasize in sectors */
/* /*
* pe_start policy: * pe_start goal: FIXME -- reality of .pv_write complexity undermines this goal
* - In cases where a pre-existing pe_start is provided (pvcreate --restorefile * - In cases where a pre-existing pe_start is provided (pvcreate --restorefile
* and vgconvert): pe_start must not be changed (so pv->pe_start = pe_start). * and vgconvert): pe_start must not be changed (so pv->pe_start = pe_start).
* - In cases where pe_start is 0: leave pv->pe_start as 0 and defer the * - In cases where pe_start is 0: leave pv->pe_start as 0 and defer the
@ -1758,6 +1781,18 @@ static int _text_pv_setup(const struct format_type *fmt,
return 0; return 0;
} }
/*
* This initialization has a side-effect of allowing
* orphaned PVs to be created with the proper alignment.
* Setting pv->pe_start here circumvents .pv_write's
* "pvcreate on PV without prior pvremove" retreival of
* the PV's previous pe_start.
* - Without this you get actual != expected pe_start
* failures in the testsuite.
*/
if (!pe_start && pv->pe_start < pv->pe_align)
pv->pe_start = pv->pe_align;
if (extent_count) if (extent_count)
pe_end = pe_start + extent_count * extent_size - 1; pe_end = pe_start + extent_count * extent_size - 1;
if (!_mda_setup(fmt, pe_start, pe_end, pvmetadatacopies, if (!_mda_setup(fmt, pe_start, pe_end, pvmetadatacopies,