From f3bb1c018f7b6e38f0351a9994760bae7d9f00e3 Mon Sep 17 00:00:00 2001 From: Alasdair G Kergon Date: Tue, 7 Oct 2014 16:45:45 +0100 Subject: [PATCH] vgremove: Use process_each_lv_in_vg. --- WHATS_NEW | 1 + lib/metadata/metadata-exported.h | 5 ----- lib/metadata/metadata.c | 16 ---------------- tools/lvremove.c | 17 ----------------- tools/toollib.c | 23 ++++++++++++++++++++++- tools/toollib.h | 11 ++++++----- tools/tools.h | 1 + tools/vgdisplay.c | 2 +- tools/vgremove.c | 8 ++++++-- 9 files changed, 37 insertions(+), 47 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index fa4ff6528..8511a4538 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.112 - ===================================== + Change vgremove to use process_each_lv_in_vg. Introduce WARN_ flags to control some metadata warning messages. Use process_each_pv in vgreduce. Refactor process_each_pv in toollib. diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index ae9996d0e..0d8db7da1 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -661,11 +661,6 @@ int vg_split_mdas(struct cmd_context *cmd, struct volume_group *vg_from, void add_pvl_to_vgs(struct volume_group *vg, struct pv_list *pvl); void del_pvl_from_vgs(struct volume_group *vg, struct pv_list *pvl); -/* FIXME: refactor / unexport when lvremove liblvm refactoring dones */ -int remove_lvs_in_vg(struct cmd_context *cmd, - struct volume_group *vg, - force_t force); - /* * free_pv_fid() must be called on every struct physical_volume allocated * by pv_create, pv_read, find_pv_by_name or to free it when no longer required. diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 5c154bdf4..9308cb739 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -518,22 +518,6 @@ int vg_rename(struct cmd_context *cmd, struct volume_group *vg, return 1; } -int remove_lvs_in_vg(struct cmd_context *cmd, - struct volume_group *vg, - force_t force) -{ - struct dm_list *lst; - struct lv_list *lvl; - - while ((lst = dm_list_first(&vg->lvs))) { - lvl = dm_list_item(lst, struct lv_list); - if (!lv_remove_with_dependencies(cmd, lvl->lv, force, 0)) - return_0; - } - - return 1; -} - int vg_remove_check(struct volume_group *vg) { unsigned lv_count; diff --git a/tools/lvremove.c b/tools/lvremove.c index 7d2fec149..1005218c0 100644 --- a/tools/lvremove.c +++ b/tools/lvremove.c @@ -15,23 +15,6 @@ #include "tools.h" -static int lvremove_single(struct cmd_context *cmd, struct logical_volume *lv, - void *handle __attribute__((unused))) -{ - /* - * Single force is equivalent to sinle --yes - * Even multiple --yes are equivalent to single --force - * When we require -ff it cannot be replaces with -f -y - */ - force_t force = (force_t) arg_count(cmd, force_ARG) - ? : (arg_is_set(cmd, yes_ARG) ? DONT_PROMPT : PROMPT); - - if (!lv_remove_with_dependencies(cmd, lv, force, 0)) - return_ECMD_FAILED; - - return ECMD_PROCESSED; -} - int lvremove(struct cmd_context *cmd, int argc, char **argv) { if (!argc) { diff --git a/tools/toollib.c b/tools/toollib.c index 3b1b00feb..8b92968c6 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -1569,6 +1569,7 @@ int process_each_vg(struct cmd_context *cmd, int argc, char **argv, int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, struct dm_list *arg_lvnames, const struct dm_list *tags_in, + int stop_on_error, void *handle, process_single_lv_fn_t process_single_lv) { int ret_max = ECMD_PROCESSED; @@ -1640,6 +1641,9 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, if (ret > ret_max) ret_max = ret; + + if (stop_on_error && ret != ECMD_PROCESSED) + return ret_max; } if (lvargs_supplied) { @@ -1826,7 +1830,7 @@ static int _process_lv_vgnameid_list(struct cmd_context *cmd, uint32_t flags, continue; } - ret = process_each_lv_in_vg(cmd, vg, &lvnames, tags_arg, + ret = process_each_lv_in_vg(cmd, vg, &lvnames, tags_arg, 0, handle, process_single_lv); unlock_and_release_vg(cmd, vg, vg_name); @@ -2254,3 +2258,20 @@ int process_each_pv_in_vg(struct cmd_context *cmd, struct volume_group *vg, return ret_max; } + +int lvremove_single(struct cmd_context *cmd, struct logical_volume *lv, + void *handle __attribute__((unused))) +{ + /* + * Single force is equivalent to single --yes + * Even multiple --yes are equivalent to single --force + * When we require -ff it cannot be replaced with -f -y + */ + force_t force = (force_t) arg_count(cmd, force_ARG) + ? : (arg_is_set(cmd, yes_ARG) ? DONT_PROMPT : PROMPT); + + if (!lv_remove_with_dependencies(cmd, lv, force, 0)) + return_ECMD_FAILED; + + return ECMD_PROCESSED; +} diff --git a/tools/toollib.h b/tools/toollib.h index 5b42f2846..037b7d70b 100644 --- a/tools/toollib.h +++ b/tools/toollib.h @@ -74,11 +74,9 @@ int process_each_pv_in_vg(struct cmd_context *cmd, struct volume_group *vg, void *handle, process_single_pv_fn_t process_single_pv); -int process_each_lv_in_vg(struct cmd_context *cmd, - struct volume_group *vg, - struct dm_list *arg_lvnames, - const struct dm_list *tagsl, - void *handle, +int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, + struct dm_list *arg_lvnames, const struct dm_list *tagsl, + int stop_on_error, void *handle, process_single_lv_fn_t process_single_lv); const char *extract_vgname(struct cmd_context *cmd, const char *lv_name); @@ -135,4 +133,7 @@ int get_and_validate_major_minor(const struct cmd_context *cmd, int validate_lvname_param(struct cmd_context *cmd, const char **vg_name, const char **lv_name); +int lvremove_single(struct cmd_context *cmd, struct logical_volume *lv, + void *handle __attribute__((unused))); + #endif diff --git a/tools/tools.h b/tools/tools.h index 134e5842b..5fa1ab62b 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -177,4 +177,5 @@ int mirror_remove_missing(struct cmd_context *cmd, int vgchange_activate(struct cmd_context *cmd, struct volume_group *vg, activation_change_t activate); + #endif diff --git a/tools/vgdisplay.c b/tools/vgdisplay.c index 95a5ebd9e..6e068aa02 100644 --- a/tools/vgdisplay.c +++ b/tools/vgdisplay.c @@ -39,7 +39,7 @@ static int vgdisplay_single(struct cmd_context *cmd, const char *vg_name, if (arg_count(cmd, verbose_ARG)) { vgdisplay_extents(vg); - process_each_lv_in_vg(cmd, vg, NULL, NULL, NULL, + process_each_lv_in_vg(cmd, vg, NULL, NULL, 0, NULL, (process_single_lv_fn_t)lvdisplay_full); log_print("--- Physical volumes ---"); diff --git a/tools/vgremove.c b/tools/vgremove.c index 0bbca768d..1dce41f24 100644 --- a/tools/vgremove.c +++ b/tools/vgremove.c @@ -27,6 +27,7 @@ static int vgremove_single(struct cmd_context *cmd, const char *vg_name, force_t force = (force_t) arg_count(cmd, force_ARG) ? : (arg_is_set(cmd, yes_ARG) ? DONT_PROMPT : PROMPT); unsigned lv_count, missing; + int ret; if (!vg_check_status(vg, EXPORTED_VG)) return_ECMD_FAILED; @@ -46,8 +47,11 @@ static int vgremove_single(struct cmd_context *cmd, const char *vg_name, return ECMD_FAILED; } } - if (!remove_lvs_in_vg(cmd, vg, force)) - return_ECMD_FAILED; + if ((ret = process_each_lv_in_vg(cmd, vg, NULL, NULL, 1, NULL, + (process_single_lv_fn_t)lvremove_single)) != ECMD_PROCESSED) { + stack; + return ret; + } } if (!force && !vg_remove_check(vg))