summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlasdair G Kergon <agk@redhat.com>2016-08-06 23:46:45 +0100
committerAlasdair G Kergon <agk@redhat.com>2016-08-06 23:46:45 +0100
commitba0c26a078119f5a7d551e047189f23bdd76e2be (patch)
tree57091d2f4513703232ae4eed82e9f4fb94e35200
parent30884208d47f9b26543134ef3d87e51422a66a85 (diff)
downloadlvm2-ba0c26a078119f5a7d551e047189f23bdd76e2be.tar.gz
raid: Pass list of LVs to remove into more fns.
-rw-r--r--lib/metadata/raid_manip.c108
1 files changed, 66 insertions, 42 deletions
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index c46802a2b..f5a800b30 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -678,8 +678,15 @@ static int _alloc_rmeta_for_lv(struct logical_volume *data_lv,
dm_list_init(&allocatable_pvs);
- if (!allocate_pvs)
+ if (!allocate_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)) {
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_")))
*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,
seg->region_size,
1 /*RAID_METADATA_AREA_LEN*/,
- &allocatable_pvs, data_lv->alloc, 0, NULL)))
+ allocate_pvs, data_lv->alloc, 0, NULL)))
return_0;
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;
}
-static int _raid_add_images(struct logical_volume *lv,
- uint32_t new_count, struct dm_list *pvs)
+static int _raid_add_images_without_commit(struct logical_volume *lv,
+ uint32_t new_count, struct dm_list *pvs)
{
- int rebuild_flag_cleared = 0;
uint32_t s;
uint32_t old_count = lv_raid_image_count(lv);
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)
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))
return_0;
@@ -921,18 +949,6 @@ to be left for these sub-lvs.
}
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_metatype(seg, idx) = AREA_UNASSIGNED;
+ /* FIXME Remove duplicated prefix? */
if (!(data_lv->name = _generate_raid_name(data_lv, "_extracted", -1)))
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,
- 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;
+ dm_list_init(&removed_lvs);
+
if (!archive(lv->vg))
return_0;
- dm_list_init(&removal_lvs);
+ if (!removal_lvs)
+ removal_lvs = &removed_lvs;
- if (!_raid_extract_images(lv, new_count, pvs, 1,
- &removal_lvs, &removal_lvs)) {
+ if (!_raid_extract_images(lv, new_count, allocate_pvs, 1,
+ removal_lvs, removal_lvs)) {
log_error("Failed to extract images from %s/%s",
lv->vg->name, lv->name);
return 0;
@@ -1130,7 +1151,7 @@ static int _raid_remove_images(struct logical_volume *lv,
/* Convert to linear? */
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"
" after linear conversion");
return 0;
@@ -1139,6 +1160,9 @@ static int _raid_remove_images(struct logical_volume *lv,
first_seg(lv)->writebehind = 0;
}
+ if (!commit)
+ return 1;
+
if (!vg_write(lv->vg)) {
log_error("Failed to write changes to %s in %s",
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)
* 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)) {
log_error("Failed to resume extracted LVs");
return 0;
@@ -1185,13 +1209,9 @@ static int _raid_remove_images(struct logical_volume *lv,
/*
* Eliminate the extracted LVs
*/
- if (!dm_list_empty(&removal_lvs)) {
- dm_list_iterate_items(lvl, &removal_lvs) {
- if (!deactivate_lv(lv->vg->cmd, lvl->lv))
- return_0;
- if (!lv_remove(lvl->lv))
- return_0;
- }
+ if (!dm_list_empty(removal_lvs)) {
+ if (!_deactivate_and_remove_lvs(lv->vg, removal_lvs))
+ return_0;
if (!vg_write(lv->vg) || !vg_commit(lv->vg))
return_0;
@@ -1214,7 +1234,8 @@ static int _raid_remove_images(struct logical_volume *lv,
* the results.
*/
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);
@@ -1235,15 +1256,15 @@ static int _lv_raid_change_image_count(struct logical_volume *lv, uint32_t new_c
}
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,
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,
@@ -2105,6 +2126,9 @@ static int _raid0_to_striped_retrieve_segments_and_lvs(struct logical_volume *lv
return 1;
}
+/*
+ * Convert a RAID0 set to striped
+ */
static int _convert_raid0_to_striped(struct logical_volume *lv,
int update_and_reload,
struct dm_list *removal_lvs)