mirror of
git://sourceware.org/git/lvm2.git
synced 2025-02-24 17:57:48 +03:00
Fix vgrename using UUID in case there are VGs with the same name.
This commit is contained in:
parent
0296197999
commit
3ad47d16ab
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.44 -
|
Version 2.02.44 -
|
||||||
====================================
|
====================================
|
||||||
|
Fix vgrename using UUID in case there are VGs with the same name.
|
||||||
Fix segfault when invalid field given in reporting commands.
|
Fix segfault when invalid field given in reporting commands.
|
||||||
Refactor init_lvm() for lvmcmdline and clvmd.
|
Refactor init_lvm() for lvmcmdline and clvmd.
|
||||||
Add liblvm interactive test infrastructure to build.
|
Add liblvm interactive test infrastructure to build.
|
||||||
|
@ -1084,9 +1084,10 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
|||||||
if (!_lv_info(cmd, lv, 1, &info, 0, 0, 0))
|
if (!_lv_info(cmd, lv, 1, &info, 0, 0, 0))
|
||||||
return_0;
|
return_0;
|
||||||
|
|
||||||
if (info.exists)
|
if (info.exists) {
|
||||||
r = dev_manager_lv_mknodes(lv);
|
if (lv_is_visible(lv))
|
||||||
else
|
r = dev_manager_lv_mknodes(lv);
|
||||||
|
} else
|
||||||
r = dev_manager_lv_rmnodes(lv);
|
r = dev_manager_lv_rmnodes(lv);
|
||||||
|
|
||||||
fs_unlock();
|
fs_unlock();
|
||||||
|
@ -1005,7 +1005,8 @@ static int _create_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root
|
|||||||
void *handle = NULL;
|
void *handle = NULL;
|
||||||
struct dm_tree_node *child;
|
struct dm_tree_node *child;
|
||||||
struct lv_layer *lvlayer;
|
struct lv_layer *lvlayer;
|
||||||
char *vgname, *lvname, *layer;
|
char *old_vgname, *old_lvname, *old_layer;
|
||||||
|
char *new_vgname, *new_lvname, *new_layer;
|
||||||
const char *name;
|
const char *name;
|
||||||
int r = 1;
|
int r = 1;
|
||||||
|
|
||||||
@ -1017,11 +1018,16 @@ static int _create_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root
|
|||||||
name = dm_tree_node_get_name(child);
|
name = dm_tree_node_get_name(child);
|
||||||
|
|
||||||
if (name && lvlayer->old_name && *lvlayer->old_name && strcmp(name, lvlayer->old_name)) {
|
if (name && lvlayer->old_name && *lvlayer->old_name && strcmp(name, lvlayer->old_name)) {
|
||||||
if (!dm_split_lvm_name(dm->mem, lvlayer->old_name, &vgname, &lvname, &layer)) {
|
if (!dm_split_lvm_name(dm->mem, lvlayer->old_name, &old_vgname, &old_lvname, &old_layer)) {
|
||||||
log_error("_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name);
|
log_error("_create_lv_symlinks: Couldn't split up old device name %s", lvlayer->old_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
fs_rename_lv(lvlayer->lv, name, lvname);
|
if (!dm_split_lvm_name(dm->mem, name, &new_vgname, &new_lvname, &new_layer)) {
|
||||||
|
log_error("_create_lv_symlinks: Couldn't split up new device name %s", name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!fs_rename_lv(lvlayer->lv, name, old_vgname, old_lvname))
|
||||||
|
r = 0;
|
||||||
} else if (!dev_manager_lv_mknodes(lvlayer->lv))
|
} else if (!dev_manager_lv_mknodes(lvlayer->lv))
|
||||||
r = 0;
|
r = 0;
|
||||||
}
|
}
|
||||||
|
@ -335,11 +335,17 @@ int fs_del_lv_byname(const char *dev_dir, const char *vg_name, const char *lv_na
|
|||||||
return _fs_op(FS_DEL, dev_dir, vg_name, lv_name, "", "");
|
return _fs_op(FS_DEL, dev_dir, vg_name, lv_name, "", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
int fs_rename_lv(struct logical_volume *lv,
|
int fs_rename_lv(struct logical_volume *lv, const char *dev,
|
||||||
const char *dev, const char *old_name)
|
const char *old_vgname, const char *old_lvname)
|
||||||
{
|
{
|
||||||
return _fs_op(FS_RENAME, lv->vg->cmd->dev_dir, lv->vg->name, lv->name,
|
if (strcmp(old_vgname, lv->vg->name)) {
|
||||||
dev, old_name);
|
return
|
||||||
|
(_fs_op(FS_DEL, lv->vg->cmd->dev_dir, old_vgname, old_lvname, "", "") &&
|
||||||
|
_fs_op(FS_ADD, lv->vg->cmd->dev_dir, lv->vg->name, lv->name, dev, ""));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return _fs_op(FS_RENAME, lv->vg->cmd->dev_dir, lv->vg->name, lv->name,
|
||||||
|
dev, old_lvname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fs_unlock(void)
|
void fs_unlock(void)
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
int fs_add_lv(const struct logical_volume *lv, const char *dev);
|
int fs_add_lv(const struct logical_volume *lv, const char *dev);
|
||||||
int fs_del_lv(const struct logical_volume *lv);
|
int fs_del_lv(const struct logical_volume *lv);
|
||||||
int fs_del_lv_byname(const char *dev_dir, const char *vg_name, const char *lv_name);
|
int fs_del_lv_byname(const char *dev_dir, const char *vg_name, const char *lv_name);
|
||||||
int fs_rename_lv(struct logical_volume *lv,
|
int fs_rename_lv(struct logical_volume *lv, const char *dev,
|
||||||
const char *dev, const char *old_name);
|
const char *old_vgname, const char *old_lvname);
|
||||||
void fs_unlock(void);
|
void fs_unlock(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -168,10 +168,7 @@ static int lvchange_availability(struct cmd_context *cmd,
|
|||||||
static int lvchange_refresh(struct cmd_context *cmd, struct logical_volume *lv)
|
static int lvchange_refresh(struct cmd_context *cmd, struct logical_volume *lv)
|
||||||
{
|
{
|
||||||
log_verbose("Refreshing logical volume \"%s\" (if active)", lv->name);
|
log_verbose("Refreshing logical volume \"%s\" (if active)", lv->name);
|
||||||
if (!suspend_lv(cmd, lv) || !resume_lv(cmd, lv))
|
return lv_refresh(cmd, lv);
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lvchange_resync(struct cmd_context *cmd,
|
static int lvchange_resync(struct cmd_context *cmd,
|
||||||
|
@ -1232,3 +1232,8 @@ int fill_vg_create_params(struct cmd_context *cmd,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lv_refresh(struct cmd_context *cmd, struct logical_volume *lv)
|
||||||
|
{
|
||||||
|
return suspend_lv(cmd, lv) && resume_lv(cmd, lv);
|
||||||
|
}
|
||||||
|
@ -100,4 +100,6 @@ int is_reserved_lvname(const char *name);
|
|||||||
int fill_vg_create_params(struct cmd_context *cmd,
|
int fill_vg_create_params(struct cmd_context *cmd,
|
||||||
char *vg_name, struct vgcreate_params *vp_new,
|
char *vg_name, struct vgcreate_params *vp_new,
|
||||||
struct vgcreate_params *vp_def);
|
struct vgcreate_params *vp_def);
|
||||||
|
|
||||||
|
int lv_refresh(struct cmd_context *cmd, struct logical_volume *lv);
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,7 +23,9 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
|
|||||||
int consistent = 1;
|
int consistent = 1;
|
||||||
int match = 0;
|
int match = 0;
|
||||||
int found_id = 0;
|
int found_id = 0;
|
||||||
|
int symlinks_refresh_ok = 1;
|
||||||
struct dm_list *vgids;
|
struct dm_list *vgids;
|
||||||
|
struct lv_list *lvl;
|
||||||
struct str_list *sl;
|
struct str_list *sl;
|
||||||
char *vg_name_new;
|
char *vg_name_new;
|
||||||
const char *vgid = NULL, *vg_name, *vg_name_old;
|
const char *vgid = NULL, *vg_name, *vg_name_old;
|
||||||
@ -122,24 +124,33 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
|
|||||||
/* Change the volume group name */
|
/* Change the volume group name */
|
||||||
vg_rename(cmd, vg, vg_name_new);
|
vg_rename(cmd, vg, vg_name_new);
|
||||||
|
|
||||||
|
/* store it on disks */
|
||||||
|
log_verbose("Writing out updated volume group");
|
||||||
|
if (!vg_write(vg) || !vg_commit(vg)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
sprintf(old_path, "%s%s", dev_dir, vg_name_old);
|
sprintf(old_path, "%s%s", dev_dir, vg_name_old);
|
||||||
sprintf(new_path, "%s%s", dev_dir, vg_name_new);
|
sprintf(new_path, "%s%s", dev_dir, vg_name_new);
|
||||||
|
|
||||||
if (activation() && dir_exists(old_path)) {
|
if (activation() && dir_exists(old_path)) {
|
||||||
log_verbose("Renaming \"%s\" to \"%s\"", old_path, new_path);
|
log_verbose("Renaming \"%s\" to \"%s\"", old_path, new_path);
|
||||||
|
|
||||||
if (test_mode())
|
if (test_mode())
|
||||||
log_verbose("Test mode: Skipping rename.");
|
log_verbose("Test mode: Skipping rename.");
|
||||||
else if (rename(old_path, new_path)) {
|
|
||||||
log_error("Renaming \"%s\" to \"%s\" failed: %s",
|
|
||||||
old_path, new_path, strerror(errno));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store it on disks */
|
else if (lvs_in_vg_activated_by_uuid_only(vg)) {
|
||||||
log_verbose("Writing out updated volume group");
|
dm_list_iterate_items(lvl, &vg->lvs)
|
||||||
if (!vg_write(vg) || !vg_commit(vg)) {
|
if (lv_is_visible(lvl->lv))
|
||||||
goto error;
|
if (!lv_refresh(cmd, lvl->lv))
|
||||||
|
symlinks_refresh_ok = 0;
|
||||||
|
|
||||||
|
if (!symlinks_refresh_ok) {
|
||||||
|
log_error("Renaming \"%s\" to \"%s\" failed",
|
||||||
|
old_path, new_path);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/******* FIXME Rename any active LVs! *****/
|
/******* FIXME Rename any active LVs! *****/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user