1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-03 05:18:29 +03:00

Slightly refactor mirror log conversions in lvconvert.

This commit is contained in:
Petr Rockai 2009-08-02 21:56:29 +00:00
parent 7aa72b6820
commit d25584e4fb

View File

@ -496,6 +496,33 @@ static void _lvconvert_mirrors_repair_ask(struct cmd_context *cmd,
}
}
static int _using_corelog(struct logical_volume *lv)
{
return !first_seg(_original_lv(lv))->log_lv;
}
static int _lv_update_log_type(struct cmd_context *cmd,
struct lvconvert_params *lp,
struct logical_volume *lv,
int corelog)
{
struct logical_volume *original_lv = _original_lv(lv);
if (_using_corelog(lv) && !corelog) {
if (!add_mirror_log(cmd, original_lv, 1,
adjusted_mirror_region_size(
lv->vg->extent_size,
lv->le_count,
lp->region_size),
lp->pvh, lp->alloc))
return_0;
} else if (!_using_corelog(lv) && corelog) {
if (!remove_mirror_log(cmd, original_lv,
lp->pv_count ? lp->pvh : NULL))
return_0;
}
return 1;
}
static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv,
struct lvconvert_params *lp)
{
@ -503,7 +530,6 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
uint32_t existing_mirrors;
const char *mirrorlog;
unsigned corelog = 0;
struct logical_volume *original_lv;
int r = 0;
struct logical_volume *log_lv;
int failed_mirrors = 0, failed_log = 0;
@ -688,20 +714,8 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
* insertion to make the end result consistent with
* linear-to-mirror conversion.
*/
original_lv = _original_lv(lv);
if (!first_seg(original_lv)->log_lv && !corelog) {
if (!add_mirror_log(cmd, original_lv, 1,
adjusted_mirror_region_size(
lv->vg->extent_size,
lv->le_count,
lp->region_size),
lp->pvh, lp->alloc))
if (!_lv_update_log_type(cmd, lp, lv, corelog))
return_0;
} else if (first_seg(original_lv)->log_lv && corelog) {
if (!remove_mirror_log(cmd, original_lv,
lp->pv_count ? lp->pvh : NULL))
return_0;
}
/* Insert a temporary layer for syncing,
* only if the original lv is using disk log. */
if (seg->log_lv && !_insert_lvconvert_layer(cmd, lv)) {
@ -722,24 +736,10 @@ static int _lvconvert_mirrors(struct cmd_context *cmd, struct logical_volume *lv
}
if (lp->mirrors == existing_mirrors) {
/*
* Convert Mirror log type
*/
original_lv = _original_lv(lv);
if (!first_seg(original_lv)->log_lv && !corelog) {
if (!add_mirror_log(cmd, original_lv, 1,
adjusted_mirror_region_size(
lv->vg->extent_size,
lv->le_count,
lp->region_size),
lp->pvh, lp->alloc))
return_0;
} else if (first_seg(original_lv)->log_lv && corelog) {
if (!remove_mirror_log(cmd, original_lv,
lp->pv_count ? lp->pvh : NULL))
if (_using_corelog(lv) != corelog) {
if (!_lv_update_log_type(cmd, lp, lv, corelog))
return_0;
} else {
/* No change */
log_error("Logical volume %s already has %"
PRIu32 " mirror(s).", lv->name,
lp->mirrors - 1);