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:
parent
5d47ed1161
commit
74e2acb680
@ -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
|
||||||
================================
|
================================
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user