From e2151fb4af9e9b025424aa5a58918597fd1804c5 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Tue, 5 Aug 2008 12:05:26 +0000 Subject: [PATCH] vgremove tries to remove lv snapshot first. Added function lv_remove_with_dependencies(). --- WHATS_NEW | 2 ++ lib/metadata/lv_manip.c | 21 +++++++++++++++++++++ lib/metadata/metadata-exported.h | 3 +++ lib/metadata/metadata.c | 4 ++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 97ef4b8b3..8529a6ded 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ Version 2.02.40 - ================================ + vgremove tries to remove lv snapshot first. + Added function lv_remove_with_dependencies(). Improve file descriptor leak detection to display likely culprit and filename. Change clustered mirror kernel module name from cmirror to dm-log-clustered. Avoid looping forever in _pv_analyze_mda_raw used by pvck. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 066f21843..c9d707c9c 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -2048,6 +2048,27 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, return 1; } +/* + * remove LVs with its dependencies - LV leaf nodes should be removed first + */ +int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv, + const force_t force) +{ + struct list *snh, *snht; + + if (lv_is_origin(lv)) { + /* remove snapshot LVs first */ + list_iterate_safe(snh, snht, &lv->snapshot_segs) { + if (!lv_remove_with_dependencies(cmd, list_struct_base(snh, struct lv_segment, + origin_list)->cow, + force)) + return 0; + } + } + + return lv_remove_single(cmd, lv, force); +} + /* * insert_layer_for_segments_on_pv() inserts a layer segment for a segment area. * However, layer modification could split the underlying layer segment. diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index aced42319..e42597a2e 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -416,6 +416,9 @@ int lv_remove(struct logical_volume *lv); int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv, force_t force); +int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv, + force_t force); + int lv_rename(struct cmd_context *cmd, struct logical_volume *lv, const char *new_name); diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 6a1b250d5..ec7b42a08 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -298,8 +298,8 @@ static int remove_lvs_in_vg(struct cmd_context *cmd, { struct lv_list *lvl; - list_iterate_items(lvl, &vg->lvs) - if (!lv_remove_single(cmd, lvl->lv, force)) + while ((lvl = list_first(&vg->lvs))) + if (!lv_remove_with_dependencies(cmd, lvl->lv, force)) return 0; return 1; -- 2.43.5