mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-25 01:34:38 +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:
parent
4cae37c340
commit
7ab37c0ffc
@ -689,6 +689,27 @@ static int _get_log_count(struct logical_volume *lv)
|
|||||||
return lv_mirror_count(log_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,
|
static int _lv_update_log_type(struct cmd_context *cmd,
|
||||||
struct lvconvert_params *lp,
|
struct lvconvert_params *lp,
|
||||||
struct logical_volume *lv,
|
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
|
* We must adjust the log first, or the entire mirror
|
||||||
* will get stuck during a suspend.
|
* 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;
|
return 0;
|
||||||
|
|
||||||
|
if (lp->mirrors == 1)
|
||||||
|
new_log_count = 0;
|
||||||
|
|
||||||
if (failed_mirrors) {
|
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))
|
_is_partial_lv, NULL, 0))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_lv_update_log_type(cmd, lp, lv, failed_pvs,
|
||||||
|
new_log_count))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!_reload_lv(cmd, lv))
|
if (!_reload_lv(cmd, lv))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user