From b45c9f49d02c721a8c8e6a8cc430687b2a90b36a Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Thu, 8 Mar 2007 21:08:25 +0000 Subject: [PATCH] Fix vgrename active LV check to ignore differing vgids. --- WHATS_NEW | 1 + lib/activate/activate.c | 43 +++++++++++++++++++++++++++++------------ lib/activate/activate.h | 1 + tools/vgrename.c | 2 +- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 18a40f171..bf1a63c5d 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.23 - ==================================== + Fix vgrename active LV check to ignore differing vgids. Remove no-longer-used uuid_out parameter from activation info functions. Fix two more segfaults if an empty config file section encountered. Move .cache file into a new /etc/lvm/cache directory by default. diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 11a6d949d..8084f5e97 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -168,6 +168,10 @@ int lvs_in_vg_activated(struct volume_group *vg) { return 0; } +int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg); +{ + return 0; +} int lvs_in_vg_opened(struct volume_group *vg) { return 0; @@ -421,21 +425,23 @@ int target_present(const char *target_name, int use_modprobe) * Returns 1 if info structure populated, else 0 on failure. */ static int _lv_info(struct cmd_context *cmd, const struct logical_volume *lv, int with_mknodes, - struct lvinfo *info, int with_open_count) + struct lvinfo *info, int with_open_count, unsigned by_uuid_only) { struct dm_info dminfo; - char *name; + char *name = NULL; if (!activation()) return 0; - if (!(name = build_dm_name(cmd->mem, lv->vg->name, lv->name, NULL))) + if (!by_uuid_only && + !(name = build_dm_name(cmd->mem, lv->vg->name, lv->name, NULL))) return_0; log_debug("Getting device info for %s", name); if (!dev_manager_info(lv->vg->cmd->mem, name, lv, with_mknodes, with_open_count, &dminfo)) { - dm_pool_free(cmd->mem, name); + if (name) + dm_pool_free(cmd->mem, name); return_0; } @@ -448,14 +454,16 @@ static int _lv_info(struct cmd_context *cmd, const struct logical_volume *lv, in info->live_table = dminfo.live_table; info->inactive_table = dminfo.inactive_table; - dm_pool_free(cmd->mem, name); + if (name) + dm_pool_free(cmd->mem, name); + return 1; } int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info, int with_open_count) { - return _lv_info(cmd, lv, 0, info, with_open_count); + return _lv_info(cmd, lv, 0, info, with_open_count, 0); } int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, @@ -466,7 +474,7 @@ int lv_info_by_lvid(struct cmd_context *cmd, const char *lvid_s, if (!(lv = lv_from_lvid(cmd, lvid_s, 0))) return 0; - return _lv_info(cmd, lv, 0, info, with_open_count); + return _lv_info(cmd, lv, 0, info, with_open_count, 0); } /* @@ -519,11 +527,12 @@ int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv, return r; } -static int _lv_active(struct cmd_context *cmd, struct logical_volume *lv) +static int _lv_active(struct cmd_context *cmd, struct logical_volume *lv, + unsigned by_uuid_only) { struct lvinfo info; - if (!lv_info(cmd, lv, &info, 0)) { + if (!_lv_info(cmd, lv, 0, &info, 0, by_uuid_only)) { stack; return -1; } @@ -607,7 +616,7 @@ static int _lv_suspend_lv(struct logical_volume *lv, int lockfs) * These two functions return the number of visible LVs in the state, * or -1 on error. */ -int lvs_in_vg_activated(struct volume_group *vg) +static int _lvs_in_vg_activated(struct volume_group *vg, unsigned by_uuid_only) { struct lv_list *lvl; int count = 0; @@ -617,12 +626,22 @@ int lvs_in_vg_activated(struct volume_group *vg) list_iterate_items(lvl, &vg->lvs) { if (lvl->lv->status & VISIBLE_LV) - count += (_lv_active(vg->cmd, lvl->lv) == 1); + count += (_lv_active(vg->cmd, lvl->lv, by_uuid_only) == 1); } return count; } +int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg) +{ + return _lvs_in_vg_activated(vg, 1); +} + +int lvs_in_vg_activated(struct volume_group *vg) +{ + return _lvs_in_vg_activated(vg, 0); +} + int lvs_in_vg_opened(struct volume_group *vg) { struct lv_list *lvl; @@ -973,7 +992,7 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv) return r; } - if (!_lv_info(cmd, lv, 1, &info, 0)) + if (!_lv_info(cmd, lv, 1, &info, 0, 0)) return_0; if (info.exists) diff --git a/lib/activate/activate.h b/lib/activate/activate.h index 803ac9002..c684f8006 100644 --- a/lib/activate/activate.h +++ b/lib/activate/activate.h @@ -83,6 +83,7 @@ int lv_mirror_percent(struct cmd_context *cmd, struct logical_volume *lv, * Return number of LVs in the VG that are active. */ int lvs_in_vg_activated(struct volume_group *vg); +int lvs_in_vg_activated_by_uuid_only(struct volume_group *vg); int lvs_in_vg_opened(struct volume_group *vg); diff --git a/tools/vgrename.c b/tools/vgrename.c index 7a724a593..0da8be663 100644 --- a/tools/vgrename.c +++ b/tools/vgrename.c @@ -118,7 +118,7 @@ int vgrename(struct cmd_context *cmd, int argc, char **argv) return ECMD_FAILED; } - if (lvs_in_vg_activated(vg_old)) { + if (lvs_in_vg_activated_by_uuid_only(vg_old)) { unlock_vg(cmd, vg_name_old); log_error("Volume group \"%s\" still has active LVs", vg_name_old);