[lvm-devel] master - toollib: select the whole structure if at least one of its items is selected

Peter Rajnoha prajnoha at fedoraproject.org
Tue Feb 10 15:12:59 UTC 2015


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=de273247118a9183eb8ba6a4615699edcb49dc2d
Commit:        de273247118a9183eb8ba6a4615699edcb49dc2d
Parent:        56011918e66adf1f639436fd6781a89ad61eb8f4
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Wed Dec 3 14:20:00 2014 +0100
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Tue Feb 10 16:05:32 2015 +0100

toollib: select the whole structure if at least one of its items is selected

This applies to:
  - process_each_lv_in_vg - the VG is selected only if at least one of its LVs is selected
  - process_each_segment_in_lv - the LV is selected only if at least one of its LV segments is selected
  - process_each_pv_in_vg - the VG is selected only if at least one of its PVs is selected
  - process_each_segment_in_pv - the PV is selected only if at least one of its PV segments is selected

So this patch causes the selection result to be properly propagated up to callers.
---
 tools/toollib.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/tools/toollib.c b/tools/toollib.c
index e38aab1..7d406ba 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -198,6 +198,28 @@ int ignore_vg(struct volume_group *vg, const char *vg_name, int allow_inconsiste
 }
 
 /*
+ * This functiona updates the "selected" arg only if last item processed
+ * is selected so this implements the "whole structure is selected if
+ * at least one of its items is selected".
+ */
+static void _update_selection_result(struct processing_handle *handle, int *selected)
+{
+	if (!handle || !handle->selection_handle)
+		return;
+
+	if (handle->selection_handle->selected)
+		*selected = 1;
+}
+
+static void _set_final_selection_result(struct processing_handle *handle, int selected)
+{
+	if (!handle || !handle->selection_handle)
+		return;
+
+	handle->selection_handle->selected = selected;
+}
+
+/*
  * Metadata iteration functions
  */
 int process_each_segment_in_pv(struct cmd_context *cmd,
@@ -207,6 +229,7 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 			       process_single_pvseg_fn_t process_single_pvseg)
 {
 	struct pv_segment *pvseg;
+	int whole_selected = 0;
 	int ret_max = ECMD_PROCESSED;
 	int ret;
 	struct pv_segment _free_pv_segment = { .pv = pv };
@@ -223,6 +246,7 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 				return_ECMD_FAILED;
 
 			ret = process_single_pvseg(cmd, vg, pvseg, handle);
+			_update_selection_result(handle, &whole_selected);
 			if (ret != ECMD_PROCESSED)
 				stack;
 			if (ret > ret_max)
@@ -230,6 +254,8 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 		}
 	}
 
+	/* the PV is selected if at least one PV segment is selected */
+	_set_final_selection_result(handle, whole_selected);
 	return ret_max;
 }
 
@@ -239,6 +265,7 @@ int process_each_segment_in_lv(struct cmd_context *cmd,
 			       process_single_seg_fn_t process_single_seg)
 {
 	struct lv_segment *seg;
+	int whole_selected = 0;
 	int ret_max = ECMD_PROCESSED;
 	int ret;
 
@@ -247,12 +274,15 @@ int process_each_segment_in_lv(struct cmd_context *cmd,
 			return_ECMD_FAILED;
 
 		ret = process_single_seg(cmd, seg, handle);
+		_update_selection_result(handle, &whole_selected);
 		if (ret != ECMD_PROCESSED)
 			stack;
 		if (ret > ret_max)
 			ret_max = ret;
 	}
 
+	/* the LV is selected if at least one LV segment is selected */
+	_set_final_selection_result(handle, whole_selected);
 	return ret_max;
 }
 
@@ -1643,6 +1673,7 @@ static int _process_vgnameid_list(struct cmd_context *cmd, uint32_t flags,
 	const char *vg_name;
 	const char *vg_uuid;
 	int selected;
+	int whole_selected = 0;
 	int ret_max = ECMD_PROCESSED;
 	int ret;
 	int skip;
@@ -1680,6 +1711,7 @@ static int _process_vgnameid_list(struct cmd_context *cmd, uint32_t flags,
 		    (!dm_list_empty(arg_tags) && str_list_match_list(arg_tags, &vg->tags, NULL))) &&
 		    select_match_vg(cmd, handle, vg, &selected) && selected) {
 			ret = process_single_vg(cmd, vg_name, vg, handle);
+			_update_selection_result(handle, &whole_selected);
 			if (ret != ECMD_PROCESSED)
 				stack;
 			if (ret > ret_max)
@@ -1692,6 +1724,8 @@ static int _process_vgnameid_list(struct cmd_context *cmd, uint32_t flags,
 			unlock_and_release_vg(cmd, vg, vg_name);
 	}
 
+	/* the VG is selected if at least one LV is selected */
+	_set_final_selection_result(handle, whole_selected);
 	return ret_max;
 }
 
@@ -1800,6 +1834,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 	int ret_max = ECMD_PROCESSED;
 	int ret = 0;
 	int selected;
+	int whole_selected = 0;
 	int handle_supplied = handle != NULL;
 	unsigned process_lv;
 	unsigned process_all = 0;
@@ -1902,6 +1937,8 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 		log_very_verbose("Processing LV %s in VG %s.", lvl->lv->name, vg->name);
 
 		ret = process_single_lv(cmd, lvl->lv, handle);
+		if (handle_supplied)
+			_update_selection_result(handle, &whole_selected);
 		if (ret != ECMD_PROCESSED)
 			stack;
 		if (ret > ret_max)
@@ -1926,6 +1963,8 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 out:
 	if (!handle_supplied)
 		destroy_processing_handle(cmd, handle, 1);
+	else
+		_set_final_selection_result(handle, whole_selected);
 	return ret_max;
 }
 
@@ -2697,6 +2736,7 @@ int process_each_pv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 			  struct processing_handle *handle,
 			  process_single_pv_fn_t process_single_pv)
 {
+	int whole_selected = 0;
 	int ret_max = ECMD_PROCESSED;
 	int ret;
 	struct pv_list *pvl;
@@ -2706,12 +2746,14 @@ int process_each_pv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 			return_ECMD_FAILED;
 
 		ret = process_single_pv(cmd, vg, pvl->pv, handle);
+		_update_selection_result(handle, &whole_selected);
 		if (ret != ECMD_PROCESSED)
 			stack;
 		if (ret > ret_max)
 			ret_max = ret;
 	}
 
+	_set_final_selection_result(handle, whole_selected);
 	return ret_max;
 }
 




More information about the lvm-devel mailing list