mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Remove new mirror logs when creation fails.
This commit is contained in:
parent
df322f0ba1
commit
46355000d1
@ -1339,56 +1339,46 @@ struct logical_volume *create_mirror_log(struct cmd_context *cmd,
|
||||
size_t len;
|
||||
struct str_list *sl;
|
||||
|
||||
if (!activation() && in_sync) {
|
||||
log_error("Aborting. Unable to create in-sync mirror log "
|
||||
"while activation is disabled.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = strlen(lv_name) + 32;
|
||||
if (!(log_name = alloca(len)) ||
|
||||
!(generate_log_name_format(vg, lv_name, log_name, len))) {
|
||||
log_error("log_name allocation failed. "
|
||||
"Remove new LV and retry.");
|
||||
log_error("log_name allocation failed.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(log_lv = lv_create_empty(log_name, NULL,
|
||||
VISIBLE_LV | LVM_READ | LVM_WRITE,
|
||||
alloc, 0, vg))) {
|
||||
stack;
|
||||
return NULL;
|
||||
}
|
||||
alloc, 0, vg)))
|
||||
return_NULL;
|
||||
|
||||
if (!lv_add_log_segment(ah, log_lv)) {
|
||||
stack;
|
||||
goto error;
|
||||
}
|
||||
if (!lv_add_log_segment(ah, log_lv))
|
||||
return_NULL;
|
||||
|
||||
/* Temporary tag mirror log */
|
||||
list_iterate_items(sl, tags)
|
||||
if (!str_list_add(cmd->mem, &log_lv->tags, sl->str)) {
|
||||
log_error("Aborting. Unable to tag mirror log.");
|
||||
goto error;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* store mirror log on disk(s) */
|
||||
if (!vg_write(vg)) {
|
||||
stack;
|
||||
goto error;
|
||||
}
|
||||
if (!vg_write(vg))
|
||||
return_NULL;
|
||||
|
||||
backup(vg);
|
||||
|
||||
if (!vg_commit(vg)) {
|
||||
stack;
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!activation() && in_sync) {
|
||||
log_error("Aborting. Unable to create in-sync mirror log "
|
||||
"while activation is disabled.");
|
||||
goto error;
|
||||
}
|
||||
if (!vg_commit(vg))
|
||||
return_NULL;
|
||||
|
||||
if (!activate_lv(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to activate mirror log. "
|
||||
"Remove new LVs and retry.");
|
||||
goto error;
|
||||
log_error("Aborting. Failed to activate mirror log.");
|
||||
goto revert_new_lv;
|
||||
}
|
||||
|
||||
list_iterate_items(sl, tags)
|
||||
@ -1398,27 +1388,35 @@ struct logical_volume *create_mirror_log(struct cmd_context *cmd,
|
||||
|
||||
if (activation() && !set_lv(cmd, log_lv, log_lv->size,
|
||||
in_sync ? -1 : 0)) {
|
||||
log_error("Aborting. Failed to wipe mirror log. "
|
||||
"Remove new LV and retry.");
|
||||
goto error;
|
||||
log_error("Aborting. Failed to wipe mirror log.");
|
||||
goto deactivate_and_revert_new_lv;
|
||||
}
|
||||
|
||||
if (activation() && !_write_log_header(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to write mirror log header. "
|
||||
"Remove new LV and retry.");
|
||||
goto error;
|
||||
log_error("Aborting. Failed to write mirror log header.");
|
||||
goto deactivate_and_revert_new_lv;
|
||||
}
|
||||
|
||||
if (!deactivate_lv(cmd, log_lv)) {
|
||||
log_error("Aborting. Failed to deactivate mirror log. "
|
||||
"Remove new LV and retry.");
|
||||
goto error;
|
||||
"Manual intervention required.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
log_lv->status &= ~VISIBLE_LV;
|
||||
|
||||
return log_lv;
|
||||
error:
|
||||
/* FIXME Attempt to clean up. */
|
||||
|
||||
deactivate_and_revert_new_lv:
|
||||
if (!deactivate_lv(cmd, log_lv)) {
|
||||
log_error("Unable to deactivate mirror log LV. "
|
||||
"Manual intervention required.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
revert_new_lv:
|
||||
if (!lv_remove(log_lv) || !vg_write(vg) || backup(vg), !vg_commit(vg))
|
||||
log_error("Manual intervention may be required to remove "
|
||||
"abandoned log LV before retrying.");
|
||||
return NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user