mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +03:00
o Get format1 building.
This commit is contained in:
parent
da4e57f2ba
commit
adbc44560b
@ -60,8 +60,6 @@ int import_pv(struct pool *mem, struct device *dev,
|
|||||||
pv->pe_count = pvd->pe_total;
|
pv->pe_count = pvd->pe_total;
|
||||||
pv->pe_allocated = pvd->pe_allocated;
|
pv->pe_allocated = pvd->pe_allocated;
|
||||||
|
|
||||||
init_list(&pv->allocated);
|
|
||||||
|
|
||||||
return 1;
|
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 import_lv(struct pool *mem, struct logical_volume *lv, struct lv_disk *lvd)
|
||||||
{
|
{
|
||||||
int len;
|
|
||||||
memset(&lv->id, 0, sizeof(lv->id));
|
memset(&lv->id, 0, sizeof(lv->id));
|
||||||
if (!(lv->name = _create_lv_name(mem, lvd->lv_name))) {
|
if (!(lv->name = _create_lv_name(mem, lvd->lv_name))) {
|
||||||
stack;
|
stack;
|
||||||
@ -244,18 +241,11 @@ int import_lv(struct pool *mem, struct logical_volume *lv, struct lv_disk *lvd)
|
|||||||
lv->status |= ALLOC_SIMPLE;
|
lv->status |= ALLOC_SIMPLE;
|
||||||
|
|
||||||
lv->read_ahead = lvd->lv_read_ahead;
|
lv->read_ahead = lvd->lv_read_ahead;
|
||||||
lv->stripes = lvd->lv_stripes;
|
|
||||||
|
|
||||||
lv->size = lvd->lv_size;
|
lv->size = lvd->lv_size;
|
||||||
lv->le_count = lvd->lv_allocated_le;
|
lv->le_count = lvd->lv_allocated_le;
|
||||||
|
|
||||||
list_init(&lv->segments);
|
list_init(&lv->segments);
|
||||||
|
|
||||||
if (!lv->segments) {
|
|
||||||
stack;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +279,8 @@ void export_lv(struct lv_disk *lvd, struct volume_group *vg,
|
|||||||
lvd->lv_status |= LV_SPINDOWN;
|
lvd->lv_status |= LV_SPINDOWN;
|
||||||
|
|
||||||
lvd->lv_read_ahead = lv->read_ahead;
|
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_size = lv->size;
|
||||||
lvd->lv_allocated_le = lv->le_count;
|
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 list *segh;
|
||||||
struct pe_disk *ped;
|
struct pe_disk *ped;
|
||||||
struct stripe_segment *seg;
|
struct stripe_segment *seg;
|
||||||
uint32_t pe;
|
uint32_t pe, s;
|
||||||
struct span *pes;
|
|
||||||
|
|
||||||
list_iterate (segh, &lv->segments) {
|
list_iterate (segh, &lv->segments) {
|
||||||
seg = list_item(segh, struct stripe_segment);
|
seg = list_item(segh, struct stripe_segment);
|
||||||
|
|
||||||
for (a = 0; a < seg->stripes; a++) {
|
for (s = 0; s < seg->stripes; s++) {
|
||||||
if (seg->areas[a].pv != pv)
|
if (seg->area[s].pv != pv)
|
||||||
continue; /* not our pv */
|
continue; /* not our pv */
|
||||||
|
|
||||||
pes = seg->areas[a].pes;
|
for (pe = 0; pe < seg->len; pe++) {
|
||||||
|
ped = &dl->extents[pe + seg->area[s].pe];
|
||||||
for (pe = 0; pe < pe->len; pe++) {
|
|
||||||
ped = &dl->extents[pe + pes->start];
|
|
||||||
ped->lv_num = lv_num;
|
ped->lv_num = lv_num;
|
||||||
ped->le_num = seg->le + a +
|
ped->le_num = seg->le + s +
|
||||||
(seg->stripes * pe);
|
(seg->stripes * pe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "dbg_malloc.h"
|
#include "dbg_malloc.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "pool.h"
|
||||||
|
#include "disk-rep.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After much thought I have decided it is easier,
|
* After much thought I have decided it is easier,
|
||||||
@ -25,6 +28,8 @@ struct pe_specifier {
|
|||||||
|
|
||||||
struct lv_map {
|
struct lv_map {
|
||||||
struct logical_volume *lv;
|
struct logical_volume *lv;
|
||||||
|
uint32_t stripes;
|
||||||
|
uint32_t stripe_size;
|
||||||
struct pe_specifier *map;
|
struct pe_specifier *map;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -50,14 +55,14 @@ _create_lv_maps(struct pool *mem, struct volume_group *vg)
|
|||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
lvm->lv = ll->lv;
|
lvm->lv = &ll->lv;
|
||||||
if (!(lvm->map = pool_zalloc(sizeof(*lvm->map)
|
if (!(lvm->map = pool_zalloc(mem, sizeof(*lvm->map)
|
||||||
* ll->lv->le_count))) {
|
* ll->lv.le_count))) {
|
||||||
stack;
|
stack;
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hash_insert(maps, ll->lv->name, lvm)) {
|
if (!hash_insert(maps, ll->lv.name, lvm)) {
|
||||||
stack;
|
stack;
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
@ -87,16 +92,24 @@ static int _fill_lv_array(struct lv_map **lvs,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lvm->stripes = ll->lvd.lv_stripes;
|
||||||
|
lvm->stripe_size = ll->lvd.lv_stripesize;
|
||||||
|
|
||||||
lvs[i++] = lvm;
|
lvs[i++] = lvm;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
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 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) {
|
list_iterate(pvdh, pvds) {
|
||||||
dl = list_item(pvdh, struct disk_list);
|
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;
|
e = dl->extents;
|
||||||
|
|
||||||
/* build an array of lv's for this pv */
|
/* build an array of lv's for this pv */
|
||||||
if (!_fill_lv_array(lvs, vg, dl)) {
|
if (!_fill_lv_array(lvms, maps, dl)) {
|
||||||
stack;
|
stack;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -121,7 +134,7 @@ static int _fill_maps(struct hash_table *maps, struct list *pvds)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
lv_num--;
|
lv_num--;
|
||||||
lvm = lvs[lv_num];
|
lvm = lvms[lv_num];
|
||||||
le = e[i].le_num;
|
le = e[i].le_num;
|
||||||
|
|
||||||
if (le >= lvm->lv->le_count) {
|
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)
|
static int _check_maps_are_complete(struct hash_table *maps)
|
||||||
{
|
{
|
||||||
struct hash_node *n;
|
struct hash_node *n;
|
||||||
|
struct lv_map *lvm;
|
||||||
|
|
||||||
for (n = hash_get_first(maps); n; n = hash_get_next(maps, n)) {
|
for (n = hash_get_first(maps); n; n = hash_get_next(maps, n)) {
|
||||||
lvm = (struct lv_map *) hash_get_data(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 s;
|
||||||
uint32_t le = seg->le + (count * seg->stripes);
|
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) ||
|
if ((lvm->map[le + s].pv != seg->area[s].pv) ||
|
||||||
(lvm->map[le + s].pe != seg->area[s].pe + count))
|
(lvm->map[le + s].pe != seg->area[s].pe + count))
|
||||||
return 0;
|
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)
|
static int _build_segments(struct pool *mem, struct lv_map *lvm)
|
||||||
{
|
{
|
||||||
uint32_t stripes = lvm->lv->stripes;
|
uint32_t stripes = lvm->stripes;
|
||||||
uint32_t le;
|
uint32_t le, s, count;
|
||||||
struct stripe_segment *seg;
|
struct stripe_segment *seg;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@ -215,7 +229,7 @@ static int _build_segments(struct pool *mem, struct lv_map *lvm)
|
|||||||
|
|
||||||
} while (_same_segment(seg, lvm, count++));
|
} while (_same_segment(seg, lvm, count++));
|
||||||
|
|
||||||
list_add(&lvm->lv->segments, seg);
|
list_add(&lvm->lv->segments, &seg->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -254,7 +268,7 @@ int import_extents(struct pool *mem, struct volume_group *vg,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_fill_maps(maps, pvds)) {
|
if (!_fill_maps(maps, vg, pvds)) {
|
||||||
log_err("Couldn't fill logical volume maps.");
|
log_err("Couldn't fill logical volume maps.");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user