summaryrefslogtreecommitdiffstats
path: root/lib/format1/import-extents.c
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2005-04-22 15:44:00 +0000
committerAlasdair Kergon <agk@redhat.com>2005-04-22 15:44:00 +0000
commit22c1a65f74835218ce743a6fb540dc60b7b458ba (patch)
tree68de75e3ca72a6de7f05b99e242ea2812da51e20 /lib/format1/import-extents.c
parente40d124e14b921a48677e3785b066c31e43f3c95 (diff)
downloadlvm2-22c1a65f74835218ce743a6fb540dc60b7b458ba.tar.gz
lvm2-22c1a65f74835218ce743a6fb540dc60b7b458ba.tar.xz
lvm2-22c1a65f74835218ce743a6fb540dc60b7b458ba.zip
extend alloc_lv_segment
Diffstat (limited to 'lib/format1/import-extents.c')
-rw-r--r--lib/format1/import-extents.c110
1 files changed, 55 insertions, 55 deletions
diff --git a/lib/format1/import-extents.c b/lib/format1/import-extents.c
index d93c8953..2080f0e6 100644
--- a/lib/format1/import-extents.c
+++ b/lib/format1/import-extents.c
@@ -207,56 +207,55 @@ static int _check_maps_are_complete(struct hash_table *maps)
static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
{
- uint32_t le = 0;
+ uint32_t le = 0, len;
struct lv_segment *seg;
+ struct segment_type *segtype;
+
+ if (!(segtype = get_segtype_from_string(cmd, "striped"))) {
+ stack;
+ return 0;
+ }
while (le < lvm->lv->le_count) {
- seg = alloc_lv_segment(cmd->mem, 1);
+ len = 0;
- seg->lv = lvm->lv;
- if (!(seg->segtype = get_segtype_from_string(cmd, "striped"))) {
- stack;
+ 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));
+
+ if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv, le,
+ len, 0, 0, 1, len, 0, 0))) {
+ log_error("Failed to allocate linear segment.");
return 0;
}
- seg->le = le;
- seg->len = 0;
- seg->area_len = 0;
- seg->stripe_size = 0;
-
set_lv_segment_area_pv(seg, 0, lvm->map[le].pv, lvm->map[le].pe);
- do {
- seg->len++;
- seg->area_len++;
- } while ((lvm->map[le + seg->len].pv == seg->area[0].u.pv.pv) &&
- (seg->area[0].u.pv.pv &&
- lvm->map[le + seg->len].pe == seg->area[0].u.pv.pe +
- seg->len));
+ list_add(&lvm->lv->segments, &seg->list);
le += seg->len;
-
- list_add(&lvm->lv->segments, &seg->list);
}
return 1;
}
-static int _check_stripe(struct lv_map *lvm, struct lv_segment *seg,
- uint32_t base_le, uint32_t len)
+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 le, st;
-
- le = base_le + seg->len;
+ uint32_t st;
/*
* Is the next physical extent in every stripe adjacent to the last?
*/
- for (st = 0; st < seg->area_count; st++)
- if ((lvm->map[le + st * len].pv != seg->area[st].u.pv.pv) ||
- (seg->area[st].u.pv.pv &&
- lvm->map[le + st * len].pe !=
- seg->area[st].u.pv.pe + seg->len)) return 0;
+ 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))
+ return 0;
return 1;
}
@@ -264,7 +263,9 @@ static int _check_stripe(struct lv_map *lvm, struct lv_segment *seg,
static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
{
uint32_t st, le = 0, len;
+ uint32_t area_len;
struct lv_segment *seg;
+ struct segment_type *segtype;
/*
* Work out overall striped length
@@ -276,43 +277,42 @@ static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
}
len = lvm->lv->le_count / lvm->stripes;
+ if (!(segtype = get_segtype_from_string(cmd, "striped"))) {
+ stack;
+ return 0;
+ }
+
while (le < len) {
- if (!(seg = alloc_lv_segment(cmd->mem, lvm->stripes))) {
- stack;
- return 0;
- }
+ area_len = 1;
- seg->lv = lvm->lv;
- if (!(seg->segtype = get_segtype_from_string(cmd, "striped"))) {
- stack;
+ /*
+ * Find how many blocks 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++;
+
+ if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv,
+ lvm->stripes * le,
+ lvm->stripes * area_len,
+ 0, lvm->stripe_size, lvm->stripes,
+ area_len, 0, 0))) {
+ log_error("Failed to allocate striped segment.");
return 0;
}
- seg->stripe_size = lvm->stripe_size;
- seg->le = seg->area_count * le;
- seg->len = 1;
- seg->area_len = 1;
/*
* Set up start positions of each stripe in this segment
*/
- for (st = 0; st < seg->area_count; st++) {
- seg->area[st].u.pv.pv = lvm->map[le + st * len].pv;
- seg->area[st].u.pv.pe = lvm->map[le + st * len].pe;
- }
+ for (st = 0; st < seg->area_count; st++)
+ set_lv_segment_area_pv(seg, st,
+ lvm->map[le + st * len].pv,
+ lvm->map[le + st * len].pe);
- /*
- * Find how many blocks are contiguous in all stripes
- * and so can form part of this segment
- */
- while (_check_stripe(lvm, seg, le, len)) {
- seg->len++;
- seg->area_len++;
- }
+ list_add(&lvm->lv->segments, &seg->list);
le += seg->len;
- seg->len *= seg->area_count;
-
- list_add(&lvm->lv->segments, &seg->list);
}
return 1;