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:
@@ -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.
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user