diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c index 04b12b048..9b6e124fb 100644 --- a/lib/format1/import-export.c +++ b/lib/format1/import-export.c @@ -60,8 +60,6 @@ int import_pv(struct pool *mem, struct device *dev, pv->pe_count = pvd->pe_total; pv->pe_allocated = pvd->pe_allocated; - init_list(&pv->allocated); - return 1; } @@ -207,7 +205,6 @@ int export_vg(struct vg_disk *vgd, struct volume_group *vg) int import_lv(struct pool *mem, struct logical_volume *lv, struct lv_disk *lvd) { - int len; memset(&lv->id, 0, sizeof(lv->id)); if (!(lv->name = _create_lv_name(mem, lvd->lv_name))) { stack; @@ -244,18 +241,11 @@ int import_lv(struct pool *mem, struct logical_volume *lv, struct lv_disk *lvd) lv->status |= ALLOC_SIMPLE; lv->read_ahead = lvd->lv_read_ahead; - lv->stripes = lvd->lv_stripes; - lv->size = lvd->lv_size; lv->le_count = lvd->lv_allocated_le; list_init(&lv->segments); - if (!lv->segments) { - stack; - return 0; - } - return 1; } @@ -289,7 +279,8 @@ void export_lv(struct lv_disk *lvd, struct volume_group *vg, lvd->lv_status |= LV_SPINDOWN; lvd->lv_read_ahead = lv->read_ahead; - lvd->lv_stripes = lv->stripes; + lvd->lv_stripes = list_item(lv->segments.n, + struct stripe_segment)->stripes; lvd->lv_size = lv->size; lvd->lv_allocated_le = lv->le_count; @@ -311,22 +302,19 @@ int export_extents(struct disk_list *dl, int lv_num, struct list *segh; struct pe_disk *ped; struct stripe_segment *seg; - uint32_t pe; - struct span *pes; + uint32_t pe, s; list_iterate (segh, &lv->segments) { seg = list_item(segh, struct stripe_segment); - for (a = 0; a < seg->stripes; a++) { - if (seg->areas[a].pv != pv) + for (s = 0; s < seg->stripes; s++) { + if (seg->area[s].pv != pv) continue; /* not our pv */ - pes = seg->areas[a].pes; - - for (pe = 0; pe < pe->len; pe++) { - ped = &dl->extents[pe + pes->start]; + for (pe = 0; pe < seg->len; pe++) { + ped = &dl->extents[pe + seg->area[s].pe]; ped->lv_num = lv_num; - ped->le_num = seg->le + a + + ped->le_num = seg->le + s + (seg->stripes * pe); } } diff --git a/lib/format1/import-extents.c b/lib/format1/import-extents.c index aa03f5eba..0cb71f089 100644 --- a/lib/format1/import-extents.c +++ b/lib/format1/import-extents.c @@ -7,6 +7,9 @@ #include "metadata.h" #include "hash.h" #include "dbg_malloc.h" +#include "log.h" +#include "pool.h" +#include "disk-rep.h" /* * After much thought I have decided it is easier, @@ -25,6 +28,8 @@ struct pe_specifier { struct lv_map { struct logical_volume *lv; + uint32_t stripes; + uint32_t stripe_size; struct pe_specifier *map; }; @@ -50,14 +55,14 @@ _create_lv_maps(struct pool *mem, struct volume_group *vg) goto bad; } - lvm->lv = ll->lv; - if (!(lvm->map = pool_zalloc(sizeof(*lvm->map) - * ll->lv->le_count))) { + lvm->lv = &ll->lv; + if (!(lvm->map = pool_zalloc(mem, sizeof(*lvm->map) + * ll->lv.le_count))) { stack; goto bad; } - if (!hash_insert(maps, ll->lv->name, lvm)) { + if (!hash_insert(maps, ll->lv.name, lvm)) { stack; goto bad; } @@ -87,16 +92,24 @@ static int _fill_lv_array(struct lv_map **lvs, return 0; } + lvm->stripes = ll->lvd.lv_stripes; + lvm->stripe_size = ll->lvd.lv_stripesize; + lvs[i++] = lvm; } return 1; } -static int _fill_maps(struct hash_table *maps, struct list *pvds) +static int _fill_maps(struct hash_table *maps, struct volume_group *vg, + struct list *pvds) { struct list *pvdh; - struct lv_map *map; + struct disk_list *dl; + struct physical_volume *pv; + struct lv_map *lvms[MAX_LV], *lvm; + struct pe_disk *e; + uint32_t i, lv_num, le; list_iterate(pvdh, pvds) { dl = list_item(pvdh, struct disk_list); @@ -104,7 +117,7 @@ static int _fill_maps(struct hash_table *maps, struct list *pvds) e = dl->extents; /* build an array of lv's for this pv */ - if (!_fill_lv_array(lvs, vg, dl)) { + if (!_fill_lv_array(lvms, maps, dl)) { stack; return 0; } @@ -121,7 +134,7 @@ static int _fill_maps(struct hash_table *maps, struct list *pvds) } else { lv_num--; - lvm = lvs[lv_num]; + lvm = lvms[lv_num]; le = e[i].le_num; if (le >= lvm->lv->le_count) { @@ -156,6 +169,7 @@ static int _check_single_map(struct lv_map *lvm) static int _check_maps_are_complete(struct hash_table *maps) { struct hash_node *n; + struct lv_map *lvm; for (n = hash_get_first(maps); n; n = hash_get_next(maps, n)) { lvm = (struct lv_map *) hash_get_data(maps, n); @@ -174,7 +188,7 @@ static int _same_segment(struct stripe_segment *seg, struct lv_map *lvm, uint32_t s; uint32_t le = seg->le + (count * seg->stripes); - for (s = 0; s < stripes; s++) { + for (s = 0; s < seg->stripes; s++) { if ((lvm->map[le + s].pv != seg->area[s].pv) || (lvm->map[le + s].pe != seg->area[s].pe + count)) return 0; @@ -184,8 +198,8 @@ static int _same_segment(struct stripe_segment *seg, struct lv_map *lvm, static int _build_segments(struct pool *mem, struct lv_map *lvm) { - uint32_t stripes = lvm->lv->stripes; - uint32_t le; + uint32_t stripes = lvm->stripes; + uint32_t le, s, count; struct stripe_segment *seg; size_t len; @@ -215,7 +229,7 @@ static int _build_segments(struct pool *mem, struct lv_map *lvm) } while (_same_segment(seg, lvm, count++)); - list_add(&lvm->lv->segments, seg); + list_add(&lvm->lv->segments, &seg->list); } return 1; @@ -254,7 +268,7 @@ int import_extents(struct pool *mem, struct volume_group *vg, goto out; } - if (!_fill_maps(maps, pvds)) { + if (!_fill_maps(maps, vg, pvds)) { log_err("Couldn't fill logical volume maps."); goto out; }