1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-09-08 13:44:19 +03:00

Fix vgrename active LV check to ignore differing vgids.

This commit is contained in:
Alasdair Kergon
2007-03-08 21:08:25 +00:00
parent 8fe54fddba
commit b45c9f49d0
4 changed files with 34 additions and 13 deletions

View File

@@ -1,5 +1,6 @@
Version 2.02.23 - Version 2.02.23 -
==================================== ====================================
Fix vgrename active LV check to ignore differing vgids.
Remove no-longer-used uuid_out parameter from activation info functions. Remove no-longer-used uuid_out parameter from activation info functions.
Fix two more segfaults if an empty config file section encountered. Fix two more segfaults if an empty config file section encountered.
Move .cache file into a new /etc/lvm/cache directory by default. Move .cache file into a new /etc/lvm/cache directory by default.

View File

@@ -168,6 +168,10 @@ int lvs_in_vg_activated(struct volume_group *vg)
{ {
return 0; 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) int lvs_in_vg_opened(struct volume_group *vg)
{ {
return 0; return 0;
@@ -421,20 +425,22 @@ int target_present(const char *target_name, int use_modprobe)
* Returns 1 if info structure populated, else 0 on failure. * 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, 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; struct dm_info dminfo;
char *name; char *name = NULL;
if (!activation()) if (!activation())
return 0; 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; return_0;
log_debug("Getting device info for %s", name); log_debug("Getting device info for %s", name);
if (!dev_manager_info(lv->vg->cmd->mem, name, lv, with_mknodes, if (!dev_manager_info(lv->vg->cmd->mem, name, lv, with_mknodes,
with_open_count, &dminfo)) { with_open_count, &dminfo)) {
if (name)
dm_pool_free(cmd->mem, name); dm_pool_free(cmd->mem, name);
return_0; 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->live_table = dminfo.live_table;
info->inactive_table = dminfo.inactive_table; info->inactive_table = dminfo.inactive_table;
if (name)
dm_pool_free(cmd->mem, name); dm_pool_free(cmd->mem, name);
return 1; return 1;
} }
int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info, int lv_info(struct cmd_context *cmd, const struct logical_volume *lv, struct lvinfo *info,
int with_open_count) 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, 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))) if (!(lv = lv_from_lvid(cmd, lvid_s, 0)))
return 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; 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; struct lvinfo info;
if (!lv_info(cmd, lv, &info, 0)) { if (!_lv_info(cmd, lv, 0, &info, 0, by_uuid_only)) {
stack; stack;
return -1; 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, * These two functions return the number of visible LVs in the state,
* or -1 on error. * 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; struct lv_list *lvl;
int count = 0; int count = 0;
@@ -617,12 +626,22 @@ int lvs_in_vg_activated(struct volume_group *vg)
list_iterate_items(lvl, &vg->lvs) { list_iterate_items(lvl, &vg->lvs) {
if (lvl->lv->status & VISIBLE_LV) 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; 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) int lvs_in_vg_opened(struct volume_group *vg)
{ {
struct lv_list *lvl; struct lv_list *lvl;
@@ -973,7 +992,7 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
return r; return r;
} }
if (!_lv_info(cmd, lv, 1, &info, 0)) if (!_lv_info(cmd, lv, 1, &info, 0, 0))
return_0; return_0;
if (info.exists) if (info.exists)

View File

@@ -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. * Return number of LVs in the VG that are active.
*/ */
int lvs_in_vg_activated(struct volume_group *vg); 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); int lvs_in_vg_opened(struct volume_group *vg);

View File

@@ -118,7 +118,7 @@ int vgrename(struct cmd_context *cmd, int argc, char **argv)
return ECMD_FAILED; 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); unlock_vg(cmd, vg_name_old);
log_error("Volume group \"%s\" still has active LVs", log_error("Volume group \"%s\" still has active LVs",
vg_name_old); vg_name_old);