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

Add mirror_seg pointer to lv_segment struct. (incomplete & untested)

This commit is contained in:
Alasdair Kergon 2005-10-27 19:58:22 +00:00
parent 5f5355cbf5
commit 5727a8fa85
6 changed files with 71 additions and 5 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.00 - Version 2.02.00 -
=================================== ===================================
Add mirror_seg pointer to lv_segment struct.
Only keep a device open if it's known to belong to a locked VG. Only keep a device open if it's known to belong to a locked VG.
Fix lvdisplay to show all mirror destinations. Fix lvdisplay to show all mirror destinations.
Replacement suspend code using libdevmapper dependency tree. Replacement suspend code using libdevmapper dependency tree.

View File

@ -2164,6 +2164,7 @@ static int _fill_in_active_list(struct dev_manager *dm, struct volume_group *vg)
static int _action_activate(struct dev_manager *dm, struct logical_volume *lv) static int _action_activate(struct dev_manager *dm, struct logical_volume *lv)
{ {
// Replace with deptree code for lv + known deps only.
if (!_scan_existing_devices(dm)) { if (!_scan_existing_devices(dm)) {
stack; stack;
return 0; return 0;

View File

@ -97,10 +97,13 @@ struct lv_segment *alloc_lv_segment(struct dm_pool *mem,
seg->region_size = region_size; seg->region_size = region_size;
seg->extents_copied = extents_copied; seg->extents_copied = extents_copied;
seg->log_lv = log_lv; seg->log_lv = log_lv;
seg->mirror_seg = NULL;
list_init(&seg->tags); list_init(&seg->tags);
if (log_lv) if (log_lv) {
log_lv->status |= MIRROR_LOG; log_lv->status |= MIRROR_LOG;
find_seg_by_le(log_lv, 0)->mirror_seg = seg;
}
return seg; return seg;
} }
@ -485,6 +488,9 @@ static int _setup_alloced_segment(struct logical_volume *lv, uint32_t status,
area_multiple = segtype_is_striped(segtype) ? area_count : 1; area_multiple = segtype_is_striped(segtype) ? area_count : 1;
/* FIXME Shouldn't log_lv always be NULL here? */
/* (As we set up log segments elsewhere) */
if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv, if (!(seg = alloc_lv_segment(lv->vg->cmd->mem, segtype, lv,
lv->le_count, lv->le_count,
aa[0].len * area_multiple, aa[0].len * area_multiple,
@ -1059,8 +1065,10 @@ int lv_add_mirror_segment(struct alloc_handle *ah,
return 0; return 0;
} }
for (m = 0; m < mirrors; m++) for (m = 0; m < mirrors; m++) {
set_lv_segment_area_lv(seg, m, sub_lvs[m], 0, MIRROR_IMAGE); set_lv_segment_area_lv(seg, m, sub_lvs[m], 0, MIRROR_IMAGE);
find_seg_by_le(sub_lvs[m], 0)->mirror_seg = seg;
}
list_add(&lv->segments, &seg->list); list_add(&lv->segments, &seg->list);
lv->le_count += ah->total_area_len; lv->le_count += ah->total_area_len;

View File

@ -85,6 +85,40 @@ int check_lv_segments(struct logical_volume *lv)
r = 0; r = 0;
} }
if (seg->log_lv) {
if (!seg_is_mirrored(seg)) {
log_error("LV %s: segment %u has log LV but "
"is not mirrored",
lv->name, seg_count);
r = 0;
}
if (!(seg->log_lv->status & MIRROR_LOG)) {
log_error("LV %s: segment %u log LV %s is not "
"a mirror log",
lv->name, seg_count, seg->log_lv->name);
r = 0;
}
if (!find_seg_by_le(seg->log_lv, 0) ||
find_seg_by_le(seg->log_lv, 0)->mirror_seg != seg) {
log_error("LV %s: segment %u log LV does not "
"point back to mirror segment",
lv->name, seg_count);
r = 0;
}
}
if (seg->status & MIRROR_IMAGE) {
if (!seg->mirror_seg ||
!seg_is_mirrored(seg->mirror_seg)) {
log_error("LV %s: segment %u mirror image "
"is not mirrored",
lv->name, seg_count);
r = 0;
}
}
for (s = 0; s < seg->area_count; s++) { for (s = 0; s < seg->area_count; s++) {
if (seg_type(seg, s) == AREA_UNASSIGNED) { if (seg_type(seg, s) == AREA_UNASSIGNED) {
log_error("LV %s: segment %u has unassigned " log_error("LV %s: segment %u has unassigned "
@ -109,6 +143,18 @@ int check_lv_segments(struct logical_volume *lv)
lv->name, seg_count, s); lv->name, seg_count, s);
r = 0; r = 0;
} }
if (seg_lv(seg, s) &&
(seg_lv(seg, s)->status & MIRROR_IMAGE) &&
(find_seg_by_le(seg_lv(seg, s),
seg_le(seg, s))->mirror_seg
!= seg)) {
log_error("LV %s: segment %u mirror "
"image %u missing mirror ptr",
lv->name, seg_count, s);
r = 0;
}
/* FIXME I don't think this ever holds? /* FIXME I don't think this ever holds?
if (seg_le(seg, s) != le) { if (seg_le(seg, s) != le) {
log_error("LV %s: segment %u has " log_error("LV %s: segment %u has "

View File

@ -251,6 +251,7 @@ struct lv_segment {
uint32_t region_size; /* For mirrors - in sectors */ uint32_t region_size; /* For mirrors - in sectors */
uint32_t extents_copied; uint32_t extents_copied;
struct logical_volume *log_lv; struct logical_volume *log_lv;
struct lv_segment *mirror_seg;
struct list tags; struct list tags;
@ -559,6 +560,10 @@ int create_mirror_layers(struct alloc_handle *ah,
struct logical_volume *log_lv); struct logical_volume *log_lv);
int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors); int remove_mirror_images(struct lv_segment *mirrored_seg, uint32_t num_mirrors);
int remove_all_mirror_images(struct logical_volume *lv); int remove_all_mirror_images(struct logical_volume *lv);
/*
* Given mirror image or mirror log segment, find corresponding mirror segment
*/
struct lv_segment *find_mirror_seg(struct lv_segment *seg);
int insert_pvmove_mirrors(struct cmd_context *cmd, int insert_pvmove_mirrors(struct cmd_context *cmd,
struct logical_volume *lv_mirr, struct logical_volume *lv_mirr,

View File

@ -22,6 +22,11 @@
#include "lv_alloc.h" #include "lv_alloc.h"
#include "lvm-string.h" #include "lvm-string.h"
struct lv_segment *find_mirror_seg(struct lv_segment *seg)
{
return seg->mirror_seg;
}
/* /*
* Ensure region size is compatible with volume size. * Ensure region size is compatible with volume size.
*/ */
@ -149,8 +154,8 @@ int create_mirror_layers(struct alloc_handle *ah,
for (m = 0; m < num_mirrors; m++) { for (m = 0; m < num_mirrors; m++) {
if (!(img_lvs[m] = lv_create_empty(lv->vg->fid, img_name, if (!(img_lvs[m] = lv_create_empty(lv->vg->fid, img_name,
NULL, LVM_READ | LVM_WRITE, NULL, LVM_READ | LVM_WRITE,
ALLOC_INHERIT, 0, lv->vg))) {\ ALLOC_INHERIT, 0, lv->vg))) {
log_error("Aborting. Failed to create submirror LV. " log_error("Aborting. Failed to create mirror image LV. "
"Remove new LV and retry."); "Remove new LV and retry.");
return 0; return 0;
} }
@ -159,7 +164,7 @@ int create_mirror_layers(struct alloc_handle *ah,
get_segtype_from_string(lv->vg->cmd, get_segtype_from_string(lv->vg->cmd,
"striped"), "striped"),
0, NULL, 0, 0, 0, NULL)) { 0, NULL, 0, 0, 0, NULL)) {
log_error("Aborting. Failed to add submirror segment " log_error("Aborting. Failed to add mirror image segment "
"to %s. Remove new LV and retry.", "to %s. Remove new LV and retry.",
img_lvs[m]->name); img_lvs[m]->name);
return 0; return 0;