summaryrefslogtreecommitdiff
path: root/lib/metadata/integrity_manip.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/metadata/integrity_manip.c')
-rw-r--r--lib/metadata/integrity_manip.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/lib/metadata/integrity_manip.c b/lib/metadata/integrity_manip.c
index df734d95c..f83b9c8c8 100644
--- a/lib/metadata/integrity_manip.c
+++ b/lib/metadata/integrity_manip.c
@@ -336,7 +336,7 @@ int lv_remove_integrity_from_raid(struct logical_volume *lv)
return 1;
}
-int lv_remove_integrity(struct logical_volume *lv)
+int lv_remove_integrity(struct logical_volume *lv, struct logical_volume **keep_lv_imeta)
{
struct cmd_context *cmd = lv->vg->cmd;
struct volume_group *vg = lv->vg;
@@ -394,7 +394,9 @@ int lv_remove_integrity(struct logical_volume *lv)
if (!lv_remove(lv_iorig))
log_error("Failed to remove unused iorig LV %s.", lv_iorig->name);
- if (!lv_remove(lv_imeta))
+ if (keep_lv_imeta)
+ *keep_lv_imeta = lv_imeta;
+ else if (!lv_remove(lv_imeta))
log_error("Failed to remove unused imeta LV %s.", lv_imeta->name);
if (!vg_write(vg) || !vg_commit(vg))
@@ -434,10 +436,10 @@ int lv_remove_integrity(struct logical_volume *lv)
*
*/
-int lv_add_integrity_to_raid(struct logical_volume *lv, const char *arg,
- struct integrity_settings *settings,
- struct dm_list *pvh)
+int lv_add_integrity_to_raid(struct logical_volume *lv, struct integrity_settings *settings,
+ struct dm_list *pvh, struct logical_volume *lv_imeta_0)
{
+ char imeta0_name[NAME_LEN];
struct lvcreate_params lp;
struct dm_list allocatable_pvs;
struct logical_volume *imeta_lvs[DEFAULT_RAID_MAX_IMAGES];
@@ -495,6 +497,21 @@ int lv_add_integrity_to_raid(struct logical_volume *lv, const char *arg,
goto_bad;
}
+ /*
+ * Use an existing lv_imeta from previous linear+integrity LV.
+ * FIXME: is it guaranteed that lv_image_0 is the existing?
+ */
+ if (!s && lv_imeta_0) {
+ if (dm_snprintf(imeta0_name, sizeof(imeta0_name), "%s_imeta", lv_image->name) < 0) {
+ /* fixme */
+ }
+ if (!lv_rename_update(cmd, lv_imeta_0, imeta0_name, 0)) {
+ /* fixme */
+ }
+ imeta_lvs[0] = lv_imeta_0;
+ continue;
+ }
+
dm_list_init(&allocatable_pvs);
if (!get_pv_list_for_lv(cmd->mem, lv_image, &allocatable_pvs)) {
@@ -659,8 +676,7 @@ bad:
return 0;
}
-int lv_add_integrity(struct logical_volume *lv, const char *arg,
- struct integrity_settings *settings,
+int lv_add_integrity(struct logical_volume *lv, struct integrity_settings *settings,
struct dm_list *pvh)
{
struct lvcreate_params lp = { 0 };