1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

raid: Pass list of LVs to remove into more fns.

This commit is contained in:
Alasdair G Kergon 2016-08-06 23:46:45 +01:00
parent 30884208d4
commit ba0c26a078

View File

@ -678,8 +678,15 @@ static int _alloc_rmeta_for_lv(struct logical_volume *data_lv,
dm_list_init(&allocatable_pvs); dm_list_init(&allocatable_pvs);
if (!allocate_pvs) if (!allocate_pvs) {
allocate_pvs = &allocatable_pvs; allocate_pvs = &allocatable_pvs;
if (!get_pv_list_for_lv(data_lv->vg->cmd->mem,
data_lv, &allocatable_pvs)) {
log_error("Failed to build list of PVs for %s/%s",
data_lv->vg->name, data_lv->name);
return 0;
}
}
if (!seg_is_linear(seg)) { if (!seg_is_linear(seg)) {
log_error(INTERNAL_ERROR "Unable to allocate RAID metadata " log_error(INTERNAL_ERROR "Unable to allocate RAID metadata "
@ -691,17 +698,10 @@ static int _alloc_rmeta_for_lv(struct logical_volume *data_lv,
if ((p = strstr(base_name, "_mimage_"))) if ((p = strstr(base_name, "_mimage_")))
*p = '\0'; *p = '\0';
if (!get_pv_list_for_lv(data_lv->vg->cmd->mem,
data_lv, &allocatable_pvs)) {
log_error("Failed to build list of PVs for %s/%s",
data_lv->vg->name, data_lv->name);
return 0;
}
if (!(ah = allocate_extents(data_lv->vg, NULL, seg->segtype, 0, 1, 0, if (!(ah = allocate_extents(data_lv->vg, NULL, seg->segtype, 0, 1, 0,
seg->region_size, seg->region_size,
1 /*RAID_METADATA_AREA_LEN*/, 1 /*RAID_METADATA_AREA_LEN*/,
&allocatable_pvs, data_lv->alloc, 0, NULL))) allocate_pvs, data_lv->alloc, 0, NULL)))
return_0; return_0;
if (!(*meta_lv = _alloc_image_component(data_lv, base_name, ah, 0, RAID_META))) { if (!(*meta_lv = _alloc_image_component(data_lv, base_name, ah, 0, RAID_META))) {
@ -714,10 +714,9 @@ static int _alloc_rmeta_for_lv(struct logical_volume *data_lv,
return 1; return 1;
} }
static int _raid_add_images(struct logical_volume *lv, static int _raid_add_images_without_commit(struct logical_volume *lv,
uint32_t new_count, struct dm_list *pvs) uint32_t new_count, struct dm_list *pvs)
{ {
int rebuild_flag_cleared = 0;
uint32_t s; uint32_t s;
uint32_t old_count = lv_raid_image_count(lv); uint32_t old_count = lv_raid_image_count(lv);
uint32_t count = new_count - old_count; uint32_t count = new_count - old_count;
@ -894,6 +893,35 @@ to be left for these sub-lvs.
dm_list_iterate_items(lvl, &data_lvs) dm_list_iterate_items(lvl, &data_lvs)
lv_set_hidden(lvl->lv); lv_set_hidden(lvl->lv);
return 1;
fail:
/* Cleanly remove newly-allocated LVs that failed insertion attempt */
dm_list_iterate_items(lvl, &meta_lvs)
if (!lv_remove(lvl->lv))
return_0;
dm_list_iterate_items(lvl, &data_lvs)
if (!lv_remove(lvl->lv))
return_0;
return 0;
}
static int _raid_add_images(struct logical_volume *lv,
uint32_t new_count, struct dm_list *pvs,
int commit)
{
int rebuild_flag_cleared = 0;
struct lv_segment *seg = first_seg(lv);
uint32_t s;
if (!_raid_add_images_without_commit(lv, new_count, pvs))
return_0;
if (!commit)
return 1;
if (!lv_update_and_reload_origin(lv)) if (!lv_update_and_reload_origin(lv))
return_0; return_0;
@ -921,18 +949,6 @@ to be left for these sub-lvs.
} }
return 1; return 1;
fail:
/* Cleanly remove newly-allocated LVs that failed insertion attempt */
dm_list_iterate_items(lvl, &meta_lvs)
if (!lv_remove(lvl->lv))
return_0;
dm_list_iterate_items(lvl, &data_lvs)
if (!lv_remove(lvl->lv))
return_0;
return 0;
} }
/* /*
@ -979,6 +995,7 @@ static int _extract_image_components(struct lv_segment *seg, uint32_t idx,
seg_type(seg, idx) = AREA_UNASSIGNED; seg_type(seg, idx) = AREA_UNASSIGNED;
seg_metatype(seg, idx) = AREA_UNASSIGNED; seg_metatype(seg, idx) = AREA_UNASSIGNED;
/* FIXME Remove duplicated prefix? */
if (!(data_lv->name = _generate_raid_name(data_lv, "_extracted", -1))) if (!(data_lv->name = _generate_raid_name(data_lv, "_extracted", -1)))
return_0; return_0;
@ -1111,18 +1128,22 @@ static int _raid_extract_images(struct logical_volume *lv, uint32_t new_count,
} }
static int _raid_remove_images(struct logical_volume *lv, static int _raid_remove_images(struct logical_volume *lv,
uint32_t new_count, struct dm_list *pvs) uint32_t new_count, struct dm_list *allocate_pvs,
struct dm_list *removal_lvs, int commit)
{ {
struct dm_list removal_lvs; struct dm_list removed_lvs;
struct lv_list *lvl; struct lv_list *lvl;
dm_list_init(&removed_lvs);
if (!archive(lv->vg)) if (!archive(lv->vg))
return_0; return_0;
dm_list_init(&removal_lvs); if (!removal_lvs)
removal_lvs = &removed_lvs;
if (!_raid_extract_images(lv, new_count, pvs, 1, if (!_raid_extract_images(lv, new_count, allocate_pvs, 1,
&removal_lvs, &removal_lvs)) { removal_lvs, removal_lvs)) {
log_error("Failed to extract images from %s/%s", log_error("Failed to extract images from %s/%s",
lv->vg->name, lv->name); lv->vg->name, lv->name);
return 0; return 0;
@ -1130,7 +1151,7 @@ static int _raid_remove_images(struct logical_volume *lv,
/* Convert to linear? */ /* Convert to linear? */
if (new_count == 1) { if (new_count == 1) {
if (!_raid_remove_top_layer(lv, &removal_lvs)) { if (!_raid_remove_top_layer(lv, removal_lvs)) {
log_error("Failed to remove RAID layer" log_error("Failed to remove RAID layer"
" after linear conversion"); " after linear conversion");
return 0; return 0;
@ -1139,6 +1160,9 @@ static int _raid_remove_images(struct logical_volume *lv,
first_seg(lv)->writebehind = 0; first_seg(lv)->writebehind = 0;
} }
if (!commit)
return 1;
if (!vg_write(lv->vg)) { if (!vg_write(lv->vg)) {
log_error("Failed to write changes to %s in %s", log_error("Failed to write changes to %s in %s",
lv->name, lv->vg->name); lv->name, lv->vg->name);
@ -1163,7 +1187,7 @@ static int _raid_remove_images(struct logical_volume *lv,
* and won't conflict with the remaining (possibly shifted) * and won't conflict with the remaining (possibly shifted)
* sub-LVs. * sub-LVs.
*/ */
dm_list_iterate_items(lvl, &removal_lvs) { dm_list_iterate_items(lvl, removal_lvs) {
if (!activate_lv_excl_local(lv->vg->cmd, lvl->lv)) { if (!activate_lv_excl_local(lv->vg->cmd, lvl->lv)) {
log_error("Failed to resume extracted LVs"); log_error("Failed to resume extracted LVs");
return 0; return 0;
@ -1185,13 +1209,9 @@ static int _raid_remove_images(struct logical_volume *lv,
/* /*
* Eliminate the extracted LVs * Eliminate the extracted LVs
*/ */
if (!dm_list_empty(&removal_lvs)) { if (!dm_list_empty(removal_lvs)) {
dm_list_iterate_items(lvl, &removal_lvs) { if (!_deactivate_and_remove_lvs(lv->vg, removal_lvs))
if (!deactivate_lv(lv->vg->cmd, lvl->lv)) return_0;
return_0;
if (!lv_remove(lvl->lv))
return_0;
}
if (!vg_write(lv->vg) || !vg_commit(lv->vg)) if (!vg_write(lv->vg) || !vg_commit(lv->vg))
return_0; return_0;
@ -1214,7 +1234,8 @@ static int _raid_remove_images(struct logical_volume *lv,
* the results. * the results.
*/ */
static int _lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_count, static int _lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_count,
struct dm_list *allocate_pvs, struct dm_list *removal_lvs) struct dm_list *allocate_pvs, struct dm_list *removal_lvs,
int commit)
{ {
uint32_t old_count = lv_raid_image_count(lv); uint32_t old_count = lv_raid_image_count(lv);
@ -1235,15 +1256,15 @@ static int _lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_c
} }
if (old_count > new_count) if (old_count > new_count)
return _raid_remove_images(lv, new_count, allocate_pvs); return _raid_remove_images(lv, new_count, allocate_pvs, removal_lvs, commit);
return _raid_add_images(lv, new_count, allocate_pvs); return _raid_add_images(lv, new_count, allocate_pvs, commit);
} }
int lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_count, int lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_count,
struct dm_list *allocate_pvs) struct dm_list *allocate_pvs)
{ {
return _lv_raid_change_image_count(lv, new_count, allocate_pvs, NULL); return _lv_raid_change_image_count(lv, new_count, allocate_pvs, NULL, 1);
} }
int lv_raid_split(struct logical_volume *lv, const char *split_name, int lv_raid_split(struct logical_volume *lv, const char *split_name,
@ -2105,6 +2126,9 @@ static int _raid0_to_striped_retrieve_segments_and_lvs(struct logical_volume *lv
return 1; return 1;
} }
/*
* Convert a RAID0 set to striped
*/
static int _convert_raid0_to_striped(struct logical_volume *lv, static int _convert_raid0_to_striped(struct logical_volume *lv,
int update_and_reload, int update_and_reload,
struct dm_list *removal_lvs) struct dm_list *removal_lvs)