mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Fix vgsplit to handle mirrors.
Reorder fields in reporting field definitions.
This commit is contained in:
parent
3a7ec38f5a
commit
ce4c33102f
@ -1,5 +1,7 @@
|
||||
Version 2.02.21 -
|
||||
===================================
|
||||
Fix vgsplit to handle mirrors.
|
||||
Reorder fields in reporting field definitions.
|
||||
Fix vgs to treat args as VGs even when PV fields are displayed.
|
||||
Fix md signature check to handle both endiannesses.
|
||||
|
||||
|
@ -868,11 +868,11 @@ static const struct dm_report_object_type _report_types[] = {
|
||||
|
||||
#define STR DM_REPORT_FIELD_TYPE_STRING
|
||||
#define NUM DM_REPORT_FIELD_TYPE_NUMBER
|
||||
#define FIELD(type, strct, sorttype, head, field, width, func, id, desc) {type, id, (off_t)((void *)&_dummy._ ## strct.field - (void *)&_dummy._ ## strct), head, width, sorttype, &_ ## func ## _disp, desc},
|
||||
#define FIELD(type, strct, sorttype, head, field, width, func, id, desc) {type, sorttype, (off_t)((void *)&_dummy._ ## strct.field - (void *)&_dummy._ ## strct), width, id, head, &_ ## func ## _disp, desc},
|
||||
|
||||
static struct dm_report_field_type _fields[] = {
|
||||
#include "columns.h"
|
||||
{0, "", 0, "", 0, 0, NULL, NULL},
|
||||
{0, 0, 0, 0, "", "", NULL, NULL},
|
||||
};
|
||||
|
||||
#undef STR
|
||||
|
@ -72,6 +72,9 @@ static int _move_lvs(struct volume_group *vg_from, struct volume_group *vg_to)
|
||||
if ((lv->status & SNAPSHOT))
|
||||
continue;
|
||||
|
||||
if ((lv->status & MIRRORED))
|
||||
continue;
|
||||
|
||||
/* Ensure all the PVs used by this LV remain in the same */
|
||||
/* VG as each other */
|
||||
vg_with = NULL;
|
||||
@ -161,6 +164,48 @@ static int _move_snapshots(struct volume_group *vg_from,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _move_mirrors(struct volume_group *vg_from,
|
||||
struct volume_group *vg_to)
|
||||
{
|
||||
struct list *lvh, *lvht;
|
||||
struct logical_volume *lv;
|
||||
struct lv_segment *seg;
|
||||
int i, seg_in, log_in;
|
||||
|
||||
list_iterate_safe(lvh, lvht, &vg_from->lvs) {
|
||||
lv = list_item(lvh, struct lv_list)->lv;
|
||||
|
||||
if (!(lv->status & MIRRORED))
|
||||
continue;
|
||||
|
||||
seg = first_seg(lv);
|
||||
|
||||
seg_in = 0;
|
||||
for (i = 0; i < seg->area_count; i++)
|
||||
if (_lv_is_in_vg(vg_to, seg_lv(seg, i)))
|
||||
seg_in++;
|
||||
|
||||
log_in = (!seg->log_lv || _lv_is_in_vg(vg_to, seg->log_lv));
|
||||
|
||||
if ((seg_in && seg_in < seg->area_count) ||
|
||||
(seg_in && seg->log_lv && !log_in) ||
|
||||
(!seg_in && seg->log_lv && log_in)) {
|
||||
log_error("Mirror %s split", lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (seg_in == seg->area_count && log_in) {
|
||||
list_del(lvh);
|
||||
list_add(&vg_to->lvs, lvh);
|
||||
|
||||
vg_from->lv_count--;
|
||||
vg_to->lv_count++;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int vgsplit(struct cmd_context *cmd, int argc, char **argv)
|
||||
{
|
||||
char *vg_name_from, *vg_name_to;
|
||||
@ -275,6 +320,10 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
|
||||
if (!(_move_snapshots(vg_from, vg_to)))
|
||||
goto error;
|
||||
|
||||
/* Move required mirrors across */
|
||||
if (!(_move_mirrors(vg_from, vg_to)))
|
||||
goto error;
|
||||
|
||||
/* FIXME Split mdas properly somehow too! */
|
||||
/* Currently we cheat by sharing the format instance and relying on
|
||||
* vg_write to ignore mdas outside the VG! Done this way, with text
|
||||
|
Loading…
Reference in New Issue
Block a user