[lvm-devel] master - report: check report type and options used for full report's subreports

Peter Rajnoha prajnoha at fedoraproject.org
Mon Jun 20 09:40:58 UTC 2016


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=31aaa3be71597ec53262177bea76365605e9199f
Commit:        31aaa3be71597ec53262177bea76365605e9199f
Parent:        b864a062217cf31d86343f37ecbefeeeb15610cf
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Tue May 3 11:42:55 2016 +0200
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Mon Jun 20 11:33:42 2016 +0200

report: check report type and options used for full report's subreports

If we have fullreport, make sure that the options/sort keys used for
each report doesn't change its type - we want to preserve the original
type so it's always 5 different subreports within fullreport (vg, lv, pv,
seg, pvseg). Since we have all report types within fullreport, users
should add fields under proper subreport type - this minimizes
duplication of info displayed on output.
---
 tools/reporter.c |   36 ++++++++++++++++++++++++------------
 1 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/tools/reporter.c b/tools/reporter.c
index 9dd302a..1fcb338 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -439,7 +439,8 @@ static int _pvsegs_in_vg(struct cmd_context *cmd, const char *vg_name,
 	return process_each_pv_in_vg(cmd, vg, handle, &_pvsegs_single);
 }
 
-static int _get_final_report_type(int args_are_pvs,
+static int _get_final_report_type(struct report_args *args,
+				  struct single_report_args *single_args,
 				  report_type_t report_type,
 				  int *lv_info_needed,
 				  int *lv_segment_status_needed,
@@ -457,8 +458,11 @@ static int _get_final_report_type(int args_are_pvs,
 	if (report_type & PVSEGS)
 		report_type |= PVS;
 	if ((report_type & (LVS | LVSINFO | LVSSTATUS | LVSINFOSTATUS)) &&
-	    (report_type & (PVS | LABEL)) && !args_are_pvs) {
-		log_error("Can't report LV and PV fields at the same time");
+	    (report_type & (PVS | LABEL)) && !(single_args->args_are_pvs || (args->full_report_vg && single_args->report_type == PVSEGS))) {
+		log_error("Can't report LV and PV fields at the same time in %sreport type \"%s\"%s%s.",
+			  args->full_report_vg ? "sub" : "" , single_args->report_prefix,
+			  args->full_report_vg ? " in VG " : "",
+			  args->full_report_vg ? args->full_report_vg->name: "");
 		return 0;
 	}
 
@@ -476,6 +480,13 @@ static int _get_final_report_type(int args_are_pvs,
 	else if (report_type & (LVS | LVSINFO | LVSSTATUS | LVSINFOSTATUS))
 		report_type = LVS;
 
+	if (args->full_report_vg && (report_type != single_args->report_type)) {
+		/* FIXME: Tell user about which columns exactly are incorrectly used for that report type... */
+		log_error("Subreport of type \"%s\" for VG %s contains columns which lead to change of report type. "
+			  "Add these columns to proper subreport type.", single_args->report_prefix, args->full_report_vg->name);
+		return 0;
+	}
+
 	*final_report_type = report_type;
 	return 1;
 }
@@ -579,15 +590,18 @@ int report_for_selection(struct cmd_context *cmd,
 			 struct logical_volume *lv)
 {
 	struct selection_handle *sh = parent_handle->selection_handle;
-	int args_are_pvs = sh->orig_report_type == PVS;
+	struct report_args args = {0};
+	struct single_report_args *single_args = &args.single_args[REPORT_IDX_SINGLE];
 	int do_lv_info, do_lv_seg_status;
 	struct processing_handle *handle;
 	int r = 0;
 
-	if (!_get_final_report_type(args_are_pvs,
-				    sh->orig_report_type | sh->report_type,
-				    &do_lv_info,
-				    &do_lv_seg_status,
+	single_args->report_type = sh->orig_report_type | sh->report_type;
+	single_args->args_are_pvs = sh->orig_report_type == PVS;
+
+	if (!_get_final_report_type(&args, single_args,
+				    single_args->report_type,
+				    &do_lv_info, &do_lv_seg_status,
 				    &sh->report_type))
 		return_0;
 
@@ -1023,10 +1037,8 @@ static int _do_report(struct cmd_context *cmd, struct processing_handle *handle,
 
 	handle->custom_handle = report_handle;
 
-	if (!_get_final_report_type(single_args->args_are_pvs,
-				    report_type, &lv_info_needed,
-				    &lv_segment_status_needed,
-				    &report_type))
+	if (!_get_final_report_type(args, single_args, report_type, &lv_info_needed,
+				    &lv_segment_status_needed, &report_type))
 		goto_out;
 
 	if (handle->report_group) {




More information about the lvm-devel mailing list