[lvm-devel] master - report: call appropriate handler to evaluate fuzzy reserved names and dynamic reserved values

Peter Rajnoha prajnoha at fedoraproject.org
Fri Jul 3 09:32:37 UTC 2015


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=3b1422c45c6c782f5134e74439ccdd6766085d4c
Commit:        3b1422c45c6c782f5134e74439ccdd6766085d4c
Parent:        335707b0e2e657a40ae87fb47dbf744cb53d74fb
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Wed May 20 18:47:54 2015 +0200
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Fri Jul 3 10:47:38 2015 +0200

report: call appropriate handler to evaluate fuzzy reserved names and dynamic reserved values

Wire the dm_report_reserved_handler instance call in reporting/selection
infrastructure to handle reserved value actions (currently only
DM_REPORT_RESERVED_PARSE_FUZZY_NAME and DM_REPORT_RESERVED_GET_DYNAMIC_VALUE
actions).
---
 lib/report/report.c  |    8 +++++
 libdm/libdm-report.c |   71 +++++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 73 insertions(+), 6 deletions(-)

diff --git a/lib/report/report.c b/lib/report/report.c
index 2e9a5d3..4d1b8eb 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -96,6 +96,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1);
  * 		- 'reserved_value_id_n' (for 0)
  */
 #define NUM uint64_t
+#define NUM_HND dm_report_reserved_handler
+#define HND (dm_report_reserved_handler)
 #define NOFLAG 0
 #define NAMED DM_REPORT_FIELD_RESERVED_VALUE_NAMED
 #define RANGE DM_REPORT_FIELD_RESERVED_VALUE_RANGE
@@ -117,6 +119,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1);
 #include "values.h"
 
 #undef NUM
+#undef NUM_HND
+#undef HND
 #undef NOFLAG
 #undef NAMED
 #undef RANGE
@@ -134,6 +138,8 @@ static const int32_t _reserved_num_undef_32 = INT32_C(-1);
 */
 
 #define NUM DM_REPORT_FIELD_TYPE_NUMBER
+#define NUM_HND DM_REPORT_FIELD_TYPE_NUMBER
+#define HND 0
 #define NOFLAG 0
 #define NAMED DM_REPORT_FIELD_RESERVED_VALUE_NAMED
 #define RANGE DM_REPORT_FIELD_RESERVED_VALUE_RANGE
@@ -154,6 +160,8 @@ static const struct dm_report_reserved_value _report_reserved_values[] = {
 };
 
 #undef NUM
+#undef NUM_HND
+#undef HND
 #undef NOFLAG
 #undef NAMED
 #undef RANGE
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 559d463..2ec98d6 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -2123,14 +2123,48 @@ static const char *_tok_value_string(const char *s,
 	return s;
 }
 
-static const char *_reserved_name(const char **names, const char *s, size_t len)
+static const char *_reserved_name(struct dm_report *rh,
+				  const struct dm_report_reserved_value *reserved,
+				  const struct dm_report_field_reserved_value *frv,
+				  uint32_t field_num, const char *s, size_t len)
 {
-	const char **name = names;
+	dm_report_reserved_handler handler;
+	const char *canonical_name;
+	const char **name;
+	char *tmp_s;
+	char c;
+	int r;
+
+	name = reserved->names;
 	while (*name) {
 		if ((strlen(*name) == len) && !strncmp(*name, s, len))
 			return *name;
 		name++;
 	}
+
+	if (reserved->type & DM_REPORT_FIELD_RESERVED_VALUE_FUZZY_NAMES) {
+		handler = (dm_report_reserved_handler) frv ? frv->value : reserved->value;
+		c = s[len];
+		tmp_s = (char *) s;
+		tmp_s[len] = '\0';
+		if ((r = handler(rh, rh->selection->mem, field_num,
+				 DM_REPORT_RESERVED_PARSE_FUZZY_NAME,
+				 tmp_s, (const void **) &canonical_name)) <= 0) {
+			if (r == -1)
+				log_error(INTERNAL_ERROR "%s reserved value handler for field %s has missing "
+					  "implementation of DM_REPORT_RESERVED_PARSE_FUZZY_NAME action",
+					  (reserved->type & DM_REPORT_FIELD_TYPE_MASK) ? "type-specific" : "field-specific",
+					   rh->fields[field_num].id);
+			else
+				log_error("Error occured while processing %s reserved value handler for field %s",
+					  (reserved->type & DM_REPORT_FIELD_TYPE_MASK) ? "type-specific" : "field-specific",
+					   rh->fields[field_num].id);
+		}
+		tmp_s[len] = c;
+		if (r && canonical_name)
+			return canonical_name;
+	}
+
 	return NULL;
 }
 
@@ -2144,6 +2178,7 @@ static const char *_get_reserved(struct dm_report *rh, unsigned type,
 				 struct reserved_value_wrapper *rvw)
 {
 	const struct dm_report_reserved_value *iter = implicit ? NULL : rh->reserved_values;
+	const struct dm_report_field_reserved_value *frv;
 	const char *tmp_begin, *tmp_end, *tmp_s = s;
 	const char *name = NULL;
 	char c;
@@ -2160,12 +2195,14 @@ static const char *_get_reserved(struct dm_report *rh, unsigned type,
 	while (iter->value) {
 		if (!(iter->type & DM_REPORT_FIELD_TYPE_MASK)) {
 			/* DM_REPORT_FIELD_TYPE_NONE - per-field reserved value */
-			if (((((const struct dm_report_field_reserved_value *) iter->value)->field_num) == field_num) &&
-			    (name = _reserved_name(iter->names, tmp_begin, tmp_end - tmp_begin)))
+			frv = (const struct dm_report_field_reserved_value *) iter->value;
+			if ((frv->field_num == field_num) && (name = _reserved_name(rh, iter, frv, field_num,
+										    tmp_begin, tmp_end - tmp_begin)))
 				break;
 		} else if (iter->type & type) {
 			/* DM_REPORT_FIELD_TYPE_* - per-type reserved value */
-			if ((name = _reserved_name(iter->names, tmp_begin, tmp_end - tmp_begin)))
+			if ((name = _reserved_name(rh, iter, NULL, field_num,
+						   tmp_begin, tmp_end - tmp_begin)))
 				break;
 		}
 		iter++;
@@ -3115,6 +3152,8 @@ static int _get_reserved_value(struct dm_report *rh, uint32_t field_num,
 			       struct reserved_value_wrapper *rvw)
 {
 	const void *tmp_value;
+	dm_report_reserved_handler handler;
+	int r;
 
 	if (!rvw->reserved) {
 		rvw->value = NULL;
@@ -3122,10 +3161,30 @@ static int _get_reserved_value(struct dm_report *rh, uint32_t field_num,
 	}
 
 	if (rvw->reserved->type & DM_REPORT_FIELD_TYPE_MASK)
+		/* type reserved value */
 		tmp_value = rvw->reserved->value;
 	else
+		/* per-field reserved value */
 		tmp_value = ((const struct dm_report_field_reserved_value *) rvw->reserved->value)->value;
 
+	if (rvw->reserved->type & (DM_REPORT_FIELD_RESERVED_VALUE_DYNAMIC_VALUE | DM_REPORT_FIELD_RESERVED_VALUE_FUZZY_NAMES)) {
+		handler = (dm_report_reserved_handler) tmp_value;
+		if ((r = handler(rh, rh->selection->mem, field_num,
+				 DM_REPORT_RESERVED_GET_DYNAMIC_VALUE,
+				 rvw->matched_name, &tmp_value) <= 0)) {
+			if (r == -1)
+				log_error(INTERNAL_ERROR "%s reserved value handler for field %s has missing"
+					  "implementation of DM_REPORT_RESERVED_GET_DYNAMIC_VALUE action",
+					  (rvw->reserved->type) & DM_REPORT_FIELD_TYPE_MASK ? "type-specific" : "field-specific",
+					  rh->fields[field_num].id);
+			else
+				log_error("Error occured while processing %s reserved value handler for field %s",
+					  (rvw->reserved->type) & DM_REPORT_FIELD_TYPE_MASK ? "type-specific" : "field-specific",
+					  rh->fields[field_num].id);
+			return 0;
+		}
+	}
+
 	rvw->value = tmp_value;
 	return 1;
 }




More information about the lvm-devel mailing list