diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2014-12-03 14:20:00 +0100 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2015-02-10 16:05:32 +0100 |
commit | de273247118a9183eb8ba6a4615699edcb49dc2d (patch) | |
tree | ef8d8e2626f92c7d827b7db57a4f0d79afb3c026 /tools | |
parent | 56011918e66adf1f639436fd6781a89ad61eb8f4 (diff) | |
download | lvm2-de273247118a9183eb8ba6a4615699edcb49dc2d.tar.gz |
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.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/toollib.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tools/toollib.c b/tools/toollib.c index e38aab1d8..7d406ba62 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; } |