1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/lib/metadata/merge.c

62 lines
1.2 KiB
C
Raw Normal View History

/*
* Copyright (C) 2001 Sistina Software
*
* This file is released under the LGPL.
*/
2002-11-18 17:04:08 +03:00
#include "lib.h"
2002-01-10 21:12:26 +03:00
#include "metadata.h"
/*
* Returns success if the segments were
* successfully merged. If the do merge, 'first'
* will be adjusted to contain both areas.
*/
2002-11-18 17:04:08 +03:00
static int _merge(struct lv_segment *first, struct lv_segment *second)
{
unsigned int s;
uint32_t width;
if (!first ||
2002-11-18 17:04:08 +03:00
(first->type != SEG_STRIPED) ||
(first->type != second->type) ||
(first->stripes != second->stripes) ||
(first->stripe_size != second->stripe_size))
return 0;
for (s = 0; s < first->stripes; s++) {
width = first->len / first->stripes;
if ((first->area[s].pv != second->area[s].pv) ||
(first->area[s].pe + width != second->area[s].pe))
return 0;
}
/* we should merge */
first->len += second->len;
return 1;
}
int lv_merge_segments(struct logical_volume *lv)
{
struct list *segh;
2002-11-18 17:04:08 +03:00
struct lv_segment *current, *prev = NULL;
list_iterate(segh, &lv->segments) {
2002-11-18 17:04:08 +03:00
current = list_item(segh, struct lv_segment);
if (_merge(prev, current))
list_del(&current->list);
else
prev = current;
}
return 1;
}
int lv_check_segments(struct logical_volume *lv)
{
return 1;
}