1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 18:55:19 +03:00

thin: vgsplit and vgmerge spare support

When spliting a VG with spare, update to which VG it will belong.

When merging and both VGs have spare, unmark the smaller one first.
This commit is contained in:
Zdenek Kabelac 2013-07-09 12:01:25 +02:00
parent aab53f46ee
commit ef3a1a0f8a
2 changed files with 36 additions and 0 deletions

View File

@ -28,6 +28,29 @@ static struct volume_group *_vgmerge_vg_read(struct cmd_context *cmd,
return vg;
}
/* Select bigger pool metadata spare volume */
static int _vgmerge_select_pool_metadata_spare(struct cmd_context *cmd,
struct volume_group *vg_to,
struct volume_group *vg_from)
{
struct volume_group *svg;
if (!vg_to->pool_metadata_spare_lv ||
!vg_from->pool_metadata_spare_lv)
return 1; /* no problem */
/* Drop smaller pool metadata spare */
svg = (vg_to->pool_metadata_spare_lv->le_count <
vg_from->pool_metadata_spare_lv->le_count) ? vg_to : vg_from;
vg_remove_pool_metadata_spare(svg);
/* Re-test lv name compatibility */
if (!vgs_are_compatible(cmd, vg_from, vg_to))
return_0;
return 1;
}
static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
const char *vg_name_from)
{
@ -73,6 +96,9 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
if (!drop_cached_metadata(vg_from))
stack;
if (!_vgmerge_select_pool_metadata_spare(cmd, vg_to, vg_from))
goto_bad;
/* Merge volume groups */
dm_list_iterate_items_safe(pvl, tpvl, &vg_from->pvs) {
del_pvl_from_vgs(vg_from, pvl);
@ -127,6 +153,10 @@ static int _vgmerge_single(struct cmd_context *cmd, const char *vg_name_to,
dm_list_move(&vg_to->fid->metadata_areas_ignored, mdah);
}
if (!vg_to->pool_metadata_spare_lv)
vg_to->pool_metadata_spare_lv =
vg_from->pool_metadata_spare_lv;
vg_to->extent_count += vg_from->extent_count;
vg_to->free_count += vg_from->free_count;

View File

@ -41,6 +41,12 @@ static int _move_one_lv(struct volume_group *vg_from,
return 0;
}
/* Moved pool metadata spare LV */
if (vg_from->pool_metadata_spare_lv == lv) {
vg_to->pool_metadata_spare_lv = lv;
vg_from->pool_metadata_spare_lv = NULL;
}
return 1;
}