r494 - in lvm2/branches/etch: debian lib/format1
Bastian Blank
waldi at alioth.debian.org
Tue Oct 2 10:57:59 UTC 2007
Author: waldi
Date: Tue Oct 2 10:57:59 2007
New Revision: 494
Log:
* debian/changelog: Update.
* lib/format1/import-extents.c: Cope with striped lvm1 metadata volumes.
Modified:
lvm2/branches/etch/debian/changelog
lvm2/branches/etch/lib/format1/import-extents.c
Modified: lvm2/branches/etch/debian/changelog
==============================================================================
--- lvm2/branches/etch/debian/changelog (original)
+++ lvm2/branches/etch/debian/changelog Tue Oct 2 10:57:59 2007
@@ -1,3 +1,10 @@
+lvm2 (2.02.06-4etch1) stable; urgency=low
+
+ * Cope with striped lvm1 metadata volumes. Patch from upstream version
+ 2.02.24, thanks to Steve McIntyre. (closes: #422963)
+
+ -- Bastian Blank <waldi at debian.org> Thu, 20 Sep 2007 22:33:48 +0000
+
lvm2 (2.02.06-4) unstable; urgency=low
* Update translations.
Modified: lvm2/branches/etch/lib/format1/import-extents.c
==============================================================================
--- lvm2/branches/etch/lib/format1/import-extents.c (original)
+++ lvm2/branches/etch/lib/format1/import-extents.c Tue Oct 2 10:57:59 2007
@@ -203,6 +203,19 @@
return 1;
}
+static uint32_t _area_length(struct lv_map *lvm, uint32_t le)
+{
+ uint32_t len = 0;
+
+ do
+ len++;
+ while ((lvm->map[le + len].pv == lvm->map[le].pv) &&
+ (lvm->map[le].pv &&
+ lvm->map[le + len].pe == lvm->map[le].pe + len));
+
+ return len;
+}
+
static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
{
uint32_t le = 0, len;
@@ -215,13 +228,7 @@
}
while (le < lvm->lv->le_count) {
- len = 0;
-
- do
- len++;
- while ((lvm->map[le + len].pv == lvm->map[le].pv) &&
- (lvm->map[le].pv &&
- lvm->map[le + len].pe == lvm->map[le].pe + len));
+ len = _area_length(lvm, le);
if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv, le,
len, 0, 0, NULL, 1, len, 0, 0, 0))) {
@@ -230,10 +237,8 @@
}
if (!set_lv_segment_area_pv(seg, 0, lvm->map[le].pv,
- lvm->map[le].pe)) {
- stack;
- return 0;
- }
+ lvm->map[le].pe))
+ return_0;
list_add(&lvm->lv->segments, &seg->list);
@@ -244,7 +249,8 @@
}
static int _check_stripe(struct lv_map *lvm, uint32_t area_count,
- uint32_t seg_len, uint32_t base_le, uint32_t len)
+ uint32_t area_len, uint32_t base_le,
+ uint32_t total_area_len)
{
uint32_t st;
@@ -252,11 +258,11 @@
* Is the next physical extent in every stripe adjacent to the last?
*/
for (st = 0; st < area_count; st++)
- if ((lvm->map[base_le + st * len + seg_len].pv !=
- lvm->map[base_le + st * len].pv) ||
- (lvm->map[base_le + st * len].pv &&
- lvm->map[base_le + st * len + seg_len].pe !=
- lvm->map[base_le + st * len].pe + seg_len))
+ if ((lvm->map[base_le + st * total_area_len + area_len].pv !=
+ lvm->map[base_le + st * total_area_len].pv) ||
+ (lvm->map[base_le + st * total_area_len].pv &&
+ lvm->map[base_le + st * total_area_len + area_len].pe !=
+ lvm->map[base_le + st * total_area_len].pe + area_len))
return 0;
return 1;
@@ -264,7 +270,7 @@
static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
{
- uint32_t st, le = 0, len;
+ uint32_t st, first_area_le = 0, total_area_len;
uint32_t area_len;
struct lv_segment *seg;
struct segment_type *segtype;
@@ -277,26 +283,25 @@
"with logical extent count (%u) for %s",
lvm->stripes, lvm->lv->le_count, lvm->lv->name);
}
- len = lvm->lv->le_count / lvm->stripes;
- if (!(segtype = get_segtype_from_string(cmd, "striped"))) {
- stack;
- return 0;
- }
+ total_area_len = lvm->lv->le_count / lvm->stripes;
+
+ if (!(segtype = get_segtype_from_string(cmd, "striped")))
+ return_0;
- while (le < len) {
+ while (first_area_le < total_area_len) {
area_len = 1;
/*
- * Find how many blocks are contiguous in all stripes
+ * Find how many extents are contiguous in all stripes
* and so can form part of this segment
*/
while (_check_stripe(lvm, lvm->stripes,
- area_len * lvm->stripes, le, len))
+ area_len, first_area_le, total_area_len))
area_len++;
if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv,
- lvm->stripes * le,
+ lvm->stripes * first_area_le,
lvm->stripes * area_len,
0, lvm->stripe_size, NULL,
lvm->stripes,
@@ -310,15 +315,13 @@
*/
for (st = 0; st < seg->area_count; st++)
if (!set_lv_segment_area_pv(seg, st,
- lvm->map[le + st * len].pv,
- lvm->map[le + st * len].pe)) {
- stack;
- return 0;
- }
+ lvm->map[first_area_le + st * total_area_len].pv,
+ lvm->map[first_area_le + st * total_area_len].pe))
+ return_0;
list_add(&lvm->lv->segments, &seg->list);
- le += seg->len;
+ first_area_le += area_len;
}
return 1;
More information about the pkg-lvm-commits
mailing list