1
0
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:
Peter Rajnoha 2008-12-19 14:22:48 +00:00
parent 0296197999
commit 3ad47d16ab
9 changed files with 55 additions and 26 deletions

View File

@ -1,5 +1,6 @@
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.
Refactor init_lvm() for lvmcmdline and clvmd.
Add liblvm interactive test infrastructure to build.

View File

@ -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))
return_0;
if (info.exists)
r = dev_manager_lv_mknodes(lv);
else
if (info.exists) {
if (lv_is_visible(lv))
r = dev_manager_lv_mknodes(lv);
} else
r = dev_manager_lv_rmnodes(lv);
fs_unlock();

View File

@ -1005,7 +1005,8 @@ static int _create_lv_symlinks(struct dev_manager *dm, struct dm_tree_node *root
void *handle = NULL;
struct dm_tree_node *child;
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;
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);
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);
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))
r = 0;
}

View File

@ -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, "", "");
}
int fs_rename_lv(struct logical_volume *lv,
const char *dev, const char *old_name)
int fs_rename_lv(struct logical_volume *lv, const char *dev,
const char *old_vgname, const char *old_lvname)
{
return _fs_op(FS_RENAME, lv->vg->cmd->dev_dir, lv->vg->name, lv->name,
dev, old_name);
if (strcmp(old_vgname, lv->vg->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)

View File

@ -26,8 +26,8 @@
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_byname(const char *dev_dir, const char *vg_name, const char *lv_name);
int fs_rename_lv(struct logical_volume *lv,
const char *dev, const char *old_name);
int fs_rename_lv(struct logical_volume *lv, const char *dev,
const char *old_vgname, const char *old_lvname);
void fs_unlock(void);
#endif

View File

@ -168,10 +168,7 @@ static int lvchange_availability(struct cmd_context *cmd,
static int lvchange_refresh(struct cmd_context *cmd, struct logical_volume *lv)
{
log_verbose("Refreshing logical volume \"%s\" (if active)", lv->name);
if (!suspend_lv(cmd, lv) || !resume_lv(cmd, lv))
return 0;
return 1;
return lv_refresh(cmd, lv);
}
static int lvchange_resync(struct cmd_context *cmd,

View File

@ -1232,3 +1232,8 @@ int fill_vg_create_params(struct cmd_context *cmd,
return 0;
}
int lv_refresh(struct cmd_context *cmd, struct logical_volume *lv)
{
return suspend_lv(cmd, lv) && resume_lv(cmd, lv);
}

View File

@ -100,4 +100,6 @@ int is_reserved_lvname(const char *name);
int fill_vg_create_params(struct cmd_context *cmd,
char *vg_name, struct vgcreate_params *vp_new,
struct vgcreate_params *vp_def);
int lv_refresh(struct cmd_context *cmd, struct logical_volume *lv);
#endif

View File

@ -23,7 +23,9 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
int consistent = 1;
int match = 0;
int found_id = 0;
int symlinks_refresh_ok = 1;
struct dm_list *vgids;
struct lv_list *lvl;
struct str_list *sl;
char *vg_name_new;
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 */
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(new_path, "%s%s", dev_dir, vg_name_new);
if (activation() && dir_exists(old_path)) {
log_verbose("Renaming \"%s\" to \"%s\"", old_path, new_path);
if (test_mode())
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 */
log_verbose("Writing out updated volume group");
if (!vg_write(vg) || !vg_commit(vg)) {
goto error;
else if (lvs_in_vg_activated_by_uuid_only(vg)) {
dm_list_iterate_items(lvl, &vg->lvs)
if (lv_is_visible(lvl->lv))
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! *****/