mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-03 05:18:29 +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 -
|
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 vgs to treat args as VGs even when PV fields are displayed.
|
||||||
Fix md signature check to handle both endiannesses.
|
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 STR DM_REPORT_FIELD_TYPE_STRING
|
||||||
#define NUM DM_REPORT_FIELD_TYPE_NUMBER
|
#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[] = {
|
static struct dm_report_field_type _fields[] = {
|
||||||
#include "columns.h"
|
#include "columns.h"
|
||||||
{0, "", 0, "", 0, 0, NULL, NULL},
|
{0, 0, 0, 0, "", "", NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef STR
|
#undef STR
|
||||||
|
@ -72,6 +72,9 @@ static int _move_lvs(struct volume_group *vg_from, struct volume_group *vg_to)
|
|||||||
if ((lv->status & SNAPSHOT))
|
if ((lv->status & SNAPSHOT))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if ((lv->status & MIRRORED))
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Ensure all the PVs used by this LV remain in the same */
|
/* Ensure all the PVs used by this LV remain in the same */
|
||||||
/* VG as each other */
|
/* VG as each other */
|
||||||
vg_with = NULL;
|
vg_with = NULL;
|
||||||
@ -161,6 +164,48 @@ static int _move_snapshots(struct volume_group *vg_from,
|
|||||||
return 1;
|
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)
|
int vgsplit(struct cmd_context *cmd, int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *vg_name_from, *vg_name_to;
|
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)))
|
if (!(_move_snapshots(vg_from, vg_to)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
/* Move required mirrors across */
|
||||||
|
if (!(_move_mirrors(vg_from, vg_to)))
|
||||||
|
goto error;
|
||||||
|
|
||||||
/* FIXME Split mdas properly somehow too! */
|
/* FIXME Split mdas properly somehow too! */
|
||||||
/* Currently we cheat by sharing the format instance and relying on
|
/* Currently we cheat by sharing the format instance and relying on
|
||||||
* vg_write to ignore mdas outside the VG! Done this way, with text
|
* vg_write to ignore mdas outside the VG! Done this way, with text
|
||||||
|
Loading…
Reference in New Issue
Block a user