[lvm-devel] master - raid0: Validate presence of raid0 meta_areas more tightly.

Alasdair Kergon agk at fedoraproject.org
Thu Aug 4 20:16:41 UTC 2016


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b1b0b134ecd55fad004d56301c52b32234db3c9a
Commit:        b1b0b134ecd55fad004d56301c52b32234db3c9a
Parent:        d1a25fe597569fd15fd934f639d41d991d767219
Author:        Alasdair G Kergon <agk at redhat.com>
AuthorDate:    Thu Aug 4 21:13:36 2016 +0100
Committer:     Alasdair G Kergon <agk at redhat.com>
CommitterDate: Thu Aug 4 21:15:07 2016 +0100

raid0: Validate presence of raid0 meta_areas more tightly.

---
 lib/metadata/merge.c      |    7 ++++++-
 lib/metadata/raid_manip.c |    9 ++++++---
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index 05cef17..ce33e28 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -97,6 +97,9 @@ static void _check_raid0_seg(struct lv_segment *seg, int *error_count)
 	if (seg_is_raid0_meta(seg) &&
 	    !seg->meta_areas)
 		raid_seg_error("no meta areas");
+	if (!seg_is_raid0_meta(seg) &&
+	    seg->meta_areas)
+		raid_seg_error("meta areas");
 	if (!seg->stripe_size)
 		raid_seg_error("zero stripe size");
 	if (!is_power_of_2(seg->stripe_size))
@@ -289,8 +292,10 @@ static void _check_raid_seg(struct lv_segment *seg, int *error_count)
 	/* Check for any MetaLV flaws like non-existing ones or size variations */
 	if (seg->meta_areas)
 		for (area_len = s = 0; s < seg->area_count; s++) {
-			if (seg_metatype(seg, s) != AREA_LV)
+			if (seg_metatype(seg, s) != AREA_LV) {
 				raid_seg_error("no MetaLV");
+				continue;
+			}
 			if (!lv_is_raid_metadata(seg_metalv(seg, s)))
 				raid_seg_error("MetaLV without RAID metadata flag");
 			if (area_len &&
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 1c03d37..109cb2e 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -1701,7 +1701,8 @@ static int _extract_image_component_list(struct lv_segment *seg,
  */
 static int _alloc_rmeta_devs_for_lv(struct logical_volume *lv,
 				    struct dm_list *meta_lvs,
-				    struct dm_list *allocate_pvs)
+				    struct dm_list *allocate_pvs,
+				    struct lv_segment_area **seg_meta_areas)
 {
 	uint32_t s;
 	struct lv_list *lvl_array;
@@ -1710,7 +1711,7 @@ static int _alloc_rmeta_devs_for_lv(struct logical_volume *lv,
 
 	dm_list_init(&data_lvs);
 
-	if (!(seg->meta_areas = dm_pool_zalloc(lv->vg->vgmem, seg->area_count * sizeof(*seg->meta_areas))))
+	if (!(*seg_meta_areas = dm_pool_zalloc(lv->vg->vgmem, seg->area_count * sizeof(*seg->meta_areas))))
 		return 0;
 
 	if (!(lvl_array = dm_pool_alloc(lv->vg->vgmem, seg->area_count * sizeof(*lvl_array))))
@@ -1736,11 +1737,12 @@ static int _alloc_and_add_rmeta_devs_for_lv(struct logical_volume *lv, struct dm
 {
 	struct lv_segment *seg = first_seg(lv);
 	struct dm_list meta_lvs;
+	struct lv_segment_area *seg_meta_areas;
 
 	dm_list_init(&meta_lvs);
 
 	log_debug_metadata("Allocating metadata LVs for %s", display_lvname(lv));
-	if (!_alloc_rmeta_devs_for_lv(lv, &meta_lvs, allocate_pvs)) {
+	if (!_alloc_rmeta_devs_for_lv(lv, &meta_lvs, allocate_pvs, &seg_meta_areas)) {
 		log_error("Failed to allocate metadata LVs for %s", display_lvname(lv));
 		return_0;
 	}
@@ -1753,6 +1755,7 @@ static int _alloc_and_add_rmeta_devs_for_lv(struct logical_volume *lv, struct dm
 	}
 
 	/* Set segment areas for metadata sub_lvs */
+	seg->meta_areas = seg_meta_areas;
 	log_debug_metadata("Adding newly allocated metadata LVs to %s", display_lvname(lv));
 	if (!_add_image_component_list(seg, 1, 0, &meta_lvs, 0)) {
 		log_error("Failed to add newly allocated metadata LVs to %s", display_lvname(lv));




More information about the lvm-devel mailing list