/*
* Copyright (C) 2003-2004 Sistina Software, Inc. All rights reserved.
- * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved.
*
* This file is part of LVM2.
*
return r;
}
-static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
- struct logical_volume *lv_mirr,
- struct dm_list *lvs_changed);
+static int _detach_pvmove_mirror(struct cmd_context *cmd,
+ struct logical_volume *lv_mirr)
+{
+ struct dm_list lvs_completed;
+ struct lv_list *lvl;
+
+ /* Update metadata to remove mirror segments and break dependencies */
+ dm_list_init(&lvs_completed);
+ if (!lv_remove_mirrors(cmd, lv_mirr, 1, 0, NULL, PVMOVE) ||
+ !remove_layers_for_segments_all(cmd, lv_mirr, PVMOVE,
+ &lvs_completed)) {
+ return 0;
+ }
+
+ dm_list_iterate_items(lvl, &lvs_completed)
+ /* FIXME Assumes only one pvmove at a time! */
+ lvl->lv->status &= ~LOCKED;
+
+ return 1;
+}
static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
struct logical_volume *lv_mirr,
}
/*
+ * FIXME: review ordering of operations above,
+ * temporary mirror should be preloaded in suspend.
+ * Also banned operation here when suspended.
* Nothing changed yet, try to revert pvmove.
*/
log_error("Temporary pvmove mirror activation failed.");
- if (!_finish_pvmove(cmd, vg, lv_mirr, lvs_changed))
+
+ /* Ensure that temporary mrror is deactivate even on other nodes. */
+ (void)deactivate_lv(cmd, lv_mirr);
+
+ /* Revert metadata */
+ if (!_detach_pvmove_mirror(cmd, lv_mirr) ||
+ !lv_remove(lv_mirr) ||
+ !vg_write(vg) || !vg_commit(vg))
log_error("ABORTING: Restoring original configuration "
"before pvmove failed. Run pvmove --abort.");
+
+ /* Unsuspend LVs */
+ if(!resume_lvs(cmd, lvs_changed))
+ stack;
+
goto out;
}
} else if (!resume_lv(cmd, lv_mirr)) {
struct dm_list *lvs_changed)
{
int r = 1;
- struct dm_list lvs_completed;
- struct lv_list *lvl;
- /* Update metadata to remove mirror segments and break dependencies */
- dm_list_init(&lvs_completed);
- if (!lv_remove_mirrors(cmd, lv_mirr, 1, 0, NULL, PVMOVE) ||
- !remove_layers_for_segments_all(cmd, lv_mirr, PVMOVE,
- &lvs_completed)) {
+ if (!_detach_pvmove_mirror(cmd, lv_mirr)) {
log_error("ABORTING: Removal of temporary mirror failed");
return 0;
}
- dm_list_iterate_items(lvl, &lvs_completed)
- /* FIXME Assumes only one pvmove at a time! */
- lvl->lv->status &= ~LOCKED;
-
/* Store metadata without dependencies on mirror segments */
if (!vg_write(vg)) {
log_error("ABORTING: Failed to write new data locations "