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

Try to fix reading in of lvm1 striped LVs.

There are two fixes other than improving variable names and updating code
layout etc.
The loop counter is incremented by area_len instead of area_len * stripes;
the 3rd _check_stripe parameter is no longer multiplied by number of stripes.
This commit is contained in:
Alasdair Kergon 2007-03-15 13:38:28 +00:00
parent 5d47ed1161
commit 74e2acb680
2 changed files with 38 additions and 35 deletions

View File

@ -1,9 +1,9 @@
Version 2.02.24 - Version 2.02.24 -
==================================== ====================================
Fix reading of striped LVs in LVM1 format.
Flag nolocking as clustered so clvmd startup sees clustered LVs. (2.02.10)
Add a few missing pieces of vgname command line validation. Add a few missing pieces of vgname command line validation.
Support the /dev/mapper prefix on most command lines. Support the /dev/mapper prefix on most command lines.
Flag nolocking as a clustered locking module as we need to be able
to look at clustered LVs at clvmd startup (2.02.10)
Version 2.02.23 - 8th March 2007 Version 2.02.23 - 8th March 2007
================================ ================================

View File

@ -203,6 +203,19 @@ static int _check_maps_are_complete(struct dm_hash_table *maps)
return 1; 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) static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
{ {
uint32_t le = 0, len; uint32_t le = 0, len;
@ -215,13 +228,7 @@ static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
} }
while (le < lvm->lv->le_count) { while (le < lvm->lv->le_count) {
len = 0; len = _area_length(lvm, le);
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, if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv, le,
len, 0, 0, NULL, 1, len, 0, 0, 0))) { len, 0, 0, NULL, 1, len, 0, 0, 0))) {
@ -230,10 +237,8 @@ static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
} }
if (!set_lv_segment_area_pv(seg, 0, lvm->map[le].pv, if (!set_lv_segment_area_pv(seg, 0, lvm->map[le].pv,
lvm->map[le].pe)) { lvm->map[le].pe))
stack; return_0;
return 0;
}
list_add(&lvm->lv->segments, &seg->list); list_add(&lvm->lv->segments, &seg->list);
@ -244,7 +249,8 @@ static int _read_linear(struct cmd_context *cmd, struct lv_map *lvm)
} }
static int _check_stripe(struct lv_map *lvm, uint32_t area_count, 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; uint32_t st;
@ -252,11 +258,11 @@ static int _check_stripe(struct lv_map *lvm, uint32_t area_count,
* Is the next physical extent in every stripe adjacent to the last? * Is the next physical extent in every stripe adjacent to the last?
*/ */
for (st = 0; st < area_count; st++) for (st = 0; st < area_count; st++)
if ((lvm->map[base_le + st * len + seg_len].pv != if ((lvm->map[base_le + st * total_area_len + area_len].pv !=
lvm->map[base_le + st * len].pv) || lvm->map[base_le + st * total_area_len].pv) ||
(lvm->map[base_le + st * len].pv && (lvm->map[base_le + st * total_area_len].pv &&
lvm->map[base_le + st * len + seg_len].pe != lvm->map[base_le + st * total_area_len + area_len].pe !=
lvm->map[base_le + st * len].pe + seg_len)) lvm->map[base_le + st * total_area_len].pe + area_len))
return 0; return 0;
return 1; return 1;
@ -264,7 +270,7 @@ static int _check_stripe(struct lv_map *lvm, uint32_t area_count,
static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm) 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; uint32_t area_len;
struct lv_segment *seg; struct lv_segment *seg;
struct segment_type *segtype; struct segment_type *segtype;
@ -277,26 +283,25 @@ static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
"with logical extent count (%u) for %s", "with logical extent count (%u) for %s",
lvm->stripes, lvm->lv->le_count, lvm->lv->name); lvm->stripes, lvm->lv->le_count, lvm->lv->name);
} }
len = lvm->lv->le_count / lvm->stripes;
if (!(segtype = get_segtype_from_string(cmd, "striped"))) { total_area_len = lvm->lv->le_count / lvm->stripes;
stack;
return 0;
}
while (le < len) { if (!(segtype = get_segtype_from_string(cmd, "striped")))
return_0;
while (first_area_le < total_area_len) {
area_len = 1; 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 * and so can form part of this segment
*/ */
while (_check_stripe(lvm, lvm->stripes, while (_check_stripe(lvm, lvm->stripes,
area_len * lvm->stripes, le, len)) area_len, first_area_le, total_area_len))
area_len++; area_len++;
if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv, if (!(seg = alloc_lv_segment(cmd->mem, segtype, lvm->lv,
lvm->stripes * le, lvm->stripes * first_area_le,
lvm->stripes * area_len, lvm->stripes * area_len,
0, lvm->stripe_size, NULL, 0, lvm->stripe_size, NULL,
lvm->stripes, lvm->stripes,
@ -310,15 +315,13 @@ static int _read_stripes(struct cmd_context *cmd, struct lv_map *lvm)
*/ */
for (st = 0; st < seg->area_count; st++) for (st = 0; st < seg->area_count; st++)
if (!set_lv_segment_area_pv(seg, st, if (!set_lv_segment_area_pv(seg, st,
lvm->map[le + st * len].pv, lvm->map[first_area_le + st * total_area_len].pv,
lvm->map[le + st * len].pe)) { lvm->map[first_area_le + st * total_area_len].pe))
stack; return_0;
return 0;
}
list_add(&lvm->lv->segments, &seg->list); list_add(&lvm->lv->segments, &seg->list);
le += seg->len; first_area_le += area_len;
} }
return 1; return 1;