From 874d697f4c8d882c6e1bff782f40a14d5414bcb2 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Fri, 21 May 2010 12:21:51 +0000 Subject: [PATCH] API change for args of process_each_lv_in_vg() Patch adds failed_lvnames to the list of parameters for process_each_lv_in_vg(). If the list is not NULL it will be filled with LV names of failing LVs during function execution. Application could later reiterate only on failed LVs. --- WHATS_NEW | 1 + tools/toollib.c | 13 +++++++++++-- tools/toollib.h | 1 + tools/vgdisplay.c | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 303fa5f60..a6b2f7733 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.67 - =============================== + Extend process_each_lv_in_vg() with support for list of failed lvnames. Return ECMD_FAILED for break in process_each_lv() and process_each_segment_in_lv(). Version 2.02.66 - 20th May 2010 diff --git a/tools/toollib.c b/tools/toollib.c index 5f5cbb33f..665d1633b 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -86,6 +86,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, const struct dm_list *arg_lvnames, const struct dm_list *tags, + struct dm_list *failed_lvnames, void *handle, process_single_lv_fn_t process_single_lv) { @@ -96,7 +97,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, unsigned tags_supplied = 0; unsigned lvargs_supplied = 0; unsigned lvargs_matched = 0; - + char *lv_name; struct lv_list *lvl; if (!vg_check_status(vg, EXPORTED_VG)) @@ -155,6 +156,14 @@ int process_each_lv_in_vg(struct cmd_context *cmd, continue; ret = process_single_lv(cmd, lvl->lv, handle); + if (ret != ECMD_PROCESSED && failed_lvnames) { + lv_name = dm_pool_strdup(cmd->mem, lvl->lv->name); + if (!lv_name || + !str_list_add(cmd->mem, failed_lvnames, lv_name)) { + log_error("Allocation failed for str_list."); + return ECMD_FAILED; + } + } if (ret > ret_max) ret_max = ret; if (sigint_caught()) @@ -325,7 +334,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv, } ret = process_each_lv_in_vg(cmd, vg, &lvnames, tags_arg, - handle, process_single_lv); + NULL, handle, process_single_lv); unlock_and_release_vg(cmd, vg, vgname); if (ret > ret_max) ret_max = ret; diff --git a/tools/toollib.h b/tools/toollib.h index 23ccd8681..daab95a39 100644 --- a/tools/toollib.h +++ b/tools/toollib.h @@ -78,6 +78,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg, const struct dm_list *arg_lvnames, const struct dm_list *tags, + struct dm_list *failed_lvnames, void *handle, process_single_lv_fn_t process_single_lv); diff --git a/tools/vgdisplay.c b/tools/vgdisplay.c index 29bc7f161..954e456b9 100644 --- a/tools/vgdisplay.c +++ b/tools/vgdisplay.c @@ -37,7 +37,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, NULL, NULL, (process_single_lv_fn_t)lvdisplay_full); log_print("--- Physical volumes ---");