1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-23 21:35:29 +03:00

Committing Taka's patch... He found a problem during

the failure of a device that contained both a image of
a mirror and an image of the mirrored log.  The order
of the handling of those faults was important (and
wrong), this patch corrects that.

Patch-From: Takahiro Yasui <tyasui@redhat.com>
This commit is contained in:
Jonathan Earl Brassow 2010-06-23 20:32:29 +00:00
parent 4cae37c340
commit 7ab37c0ffc

View File

@ -689,6 +689,27 @@ static int _get_log_count(struct logical_volume *lv)
return lv_mirror_count(log_lv);
}
static int _lv_update_mirrored_log(struct logical_volume *lv,
struct dm_list *operable_pvs,
int log_count)
{
int old_log_count;
struct logical_volume *log_lv;
log_lv = first_seg(_original_lv(lv))->log_lv;
if (!log_lv || !(log_lv->status & MIRRORED))
return 1;
old_log_count = _get_log_count(lv);
if (old_log_count == log_count)
return 1;
/* Reducing redundancy of the log */
return remove_mirror_images(log_lv, log_count,
is_mirror_image_removable,
operable_pvs, 0U);
}
static int _lv_update_log_type(struct cmd_context *cmd,
struct lvconvert_params *lp,
struct logical_volume *lv,
@ -1218,15 +1239,23 @@ static int _lvconvert_mirrors_repair(struct cmd_context *cmd,
* We must adjust the log first, or the entire mirror
* will get stuck during a suspend.
*/
if (!_lv_update_log_type(cmd, lp, lv, failed_pvs, new_log_count))
if (!_lv_update_mirrored_log(lv, failed_pvs, new_log_count))
return 0;
if (lp->mirrors == 1)
new_log_count = 0;
if (failed_mirrors) {
if (!lv_remove_mirrors(cmd, lv, failed_mirrors, new_log_count,
if (!lv_remove_mirrors(cmd, lv, failed_mirrors,
new_log_count ? 0U : 1U,
_is_partial_lv, NULL, 0))
return 0;
}
if (!_lv_update_log_type(cmd, lp, lv, failed_pvs,
new_log_count))
return 0;
if (!_reload_lv(cmd, lv))
return 0;