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 - 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.

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)) 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();

View File

@ -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;
} }

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, "", ""); 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)

View File

@ -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

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) 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,

View File

@ -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);
}

View File

@ -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

View File

@ -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! *****/