[lvm-devel] master - cache: validation for cache_metadata_format

Zdenek Kabelac zkabelac at sourceware.org
Fri Mar 10 18:37:15 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=64d3f05aa1ee22cb337d5d8e9d650cb02040543a
Commit:        64d3f05aa1ee22cb337d5d8e9d650cb02040543a
Parent:        825c16e57e0e05bbffda9a32ea245c0e6acfb081
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Sun Feb 26 21:22:43 2017 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Fri Mar 10 19:33:01 2017 +0100

cache: validation for cache_metadata_format

Only  cache-pool segtype may store cache_metadata_format.
Only supported values are 0,1,2
Format 2 requires LV status uses LV_METADATA_FORMAT.
Format 0 (unselected) or 1 shall not set this 'incompatible' status.
---
 lib/metadata/merge.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c
index a5cb9f3..3d82a05 100644
--- a/lib/metadata/merge.c
+++ b/lib/metadata/merge.c
@@ -328,6 +328,13 @@ static void _check_lv_segment(struct logical_volume *lv, struct lv_segment *seg,
 
 	if (seg_is_cache_pool(seg)) {
 		if (!dm_list_empty(&seg->lv->segs_using_this_lv)) {
+			switch (seg->cache_metadata_format) {
+			case CACHE_METADATA_FORMAT_2:
+			case CACHE_METADATA_FORMAT_1:
+				break;
+			default:
+				seg_error("has invalid cache metadata format");
+			}
 			switch (seg->cache_mode) {
 			case CACHE_MODE_WRITETHROUGH:
 			case CACHE_MODE_WRITEBACK:
@@ -341,13 +348,22 @@ static void _check_lv_segment(struct logical_volume *lv, struct lv_segment *seg,
 		}
 		if (!validate_cache_chunk_size(lv->vg->cmd, seg->chunk_size))
 			seg_error("has invalid chunk size.");
+		if (seg->lv->status & LV_METADATA_FORMAT) {
+			if (seg->cache_metadata_format != CACHE_METADATA_FORMAT_2)
+				seg_error("sets METADATA_FORMAT flag");
+		} else if (seg->cache_metadata_format == CACHE_METADATA_FORMAT_2)
+			seg_error("is missing METADATA_FORMAT flag");
 	} else { /* !cache_pool */
+		if (seg->cache_metadata_format)
+			seg_error("sets cache metadata format");
 		if (seg->cache_mode)
 			seg_error("sets cache mode");
 		if (seg->policy_name)
 			seg_error("sets policy name");
 		if (seg->policy_settings)
 			seg_error("sets policy settings");
+		if (seg->lv->status & LV_METADATA_FORMAT)
+			seg_error("sets METADATA_FORMAT flag");
 	}
 
 	if (!seg_can_error_when_full(seg) && lv_is_error_when_full(lv))




More information about the lvm-devel mailing list