vgrename.c revision 1.1.1.2 1 1.1 haad /* $NetBSD: vgrename.c,v 1.1.1.2 2009/02/18 11:17:51 haad Exp $ */
2 1.1 haad
3 1.1 haad /*
4 1.1 haad * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
5 1.1 haad * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
6 1.1 haad *
7 1.1 haad * This file is part of LVM2.
8 1.1 haad *
9 1.1 haad * This copyrighted material is made available to anyone wishing to use,
10 1.1 haad * modify, copy, or redistribute it subject to the terms and conditions
11 1.1 haad * of the GNU Lesser General Public License v.2.1.
12 1.1 haad *
13 1.1 haad * You should have received a copy of the GNU Lesser General Public License
14 1.1 haad * along with this program; if not, write to the Free Software Foundation,
15 1.1 haad * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 1.1 haad */
17 1.1 haad
18 1.1 haad #include "tools.h"
19 1.1 haad
20 1.1 haad static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
21 1.1 haad const char *new_vg_path)
22 1.1 haad {
23 1.1 haad char *dev_dir;
24 1.1 haad struct id id;
25 1.1 haad int consistent = 1;
26 1.1 haad int match = 0;
27 1.1 haad int found_id = 0;
28 1.1 haad struct dm_list *vgids;
29 1.1 haad struct str_list *sl;
30 1.1 haad char *vg_name_new;
31 1.1 haad const char *vgid = NULL, *vg_name, *vg_name_old;
32 1.1 haad char old_path[NAME_LEN], new_path[NAME_LEN];
33 1.1 haad struct volume_group *vg, *vg_new;
34 1.1 haad
35 1.1 haad vg_name_old = skip_dev_dir(cmd, old_vg_path, NULL);
36 1.1 haad vg_name_new = skip_dev_dir(cmd, new_vg_path, NULL);
37 1.1 haad
38 1.1 haad dev_dir = cmd->dev_dir;
39 1.1 haad
40 1.1 haad if (!validate_vg_rename_params(cmd, vg_name_old, vg_name_new))
41 1.1 haad return 0;
42 1.1 haad
43 1.1 haad log_verbose("Checking for existing volume group \"%s\"", vg_name_old);
44 1.1 haad
45 1.1 haad /* Avoid duplicates */
46 1.1 haad if (!(vgids = get_vgids(cmd, 0)) || dm_list_empty(vgids)) {
47 1.1 haad log_error("No complete volume groups found");
48 1.1 haad return 0;
49 1.1 haad }
50 1.1 haad
51 1.1 haad dm_list_iterate_items(sl, vgids) {
52 1.1 haad vgid = sl->str;
53 1.1 haad if (!vgid || !(vg_name = vgname_from_vgid(NULL, vgid)) ||
54 1.1 haad is_orphan_vg(vg_name))
55 1.1 haad continue;
56 1.1 haad if (!strcmp(vg_name, vg_name_old)) {
57 1.1 haad if (match) {
58 1.1 haad log_error("Found more than one VG called %s. "
59 1.1 haad "Please supply VG uuid.", vg_name_old);
60 1.1 haad return 0;
61 1.1 haad }
62 1.1 haad match = 1;
63 1.1 haad }
64 1.1 haad }
65 1.1 haad
66 1.1 haad log_suppress(2);
67 1.1 haad found_id = id_read_format(&id, vg_name_old);
68 1.1 haad log_suppress(0);
69 1.1 haad if (found_id && (vg_name = vgname_from_vgid(cmd->mem, (char *)id.uuid))) {
70 1.1 haad vg_name_old = vg_name;
71 1.1 haad vgid = (char *)id.uuid;
72 1.1 haad } else
73 1.1 haad vgid = NULL;
74 1.1 haad
75 1.1 haad if (!lock_vol(cmd, vg_name_old, LCK_VG_WRITE)) {
76 1.1 haad log_error("Can't get lock for %s", vg_name_old);
77 1.1 haad return 0;
78 1.1 haad }
79 1.1 haad
80 1.1 haad if (!(vg = vg_read(cmd, vg_name_old, vgid, &consistent)) || !consistent) {
81 1.1 haad log_error("Volume group %s %s%s%snot found.", vg_name_old,
82 1.1 haad vgid ? "(" : "", vgid ? vgid : "", vgid ? ") " : "");
83 1.1 haad unlock_vg(cmd, vg_name_old);
84 1.1 haad return 0;
85 1.1 haad }
86 1.1 haad
87 1.1 haad if (!vg_check_status(vg, CLUSTERED | LVM_WRITE)) {
88 1.1 haad unlock_vg(cmd, vg_name_old);
89 1.1 haad return 0;
90 1.1 haad }
91 1.1 haad
92 1.1 haad /* Don't return failure for EXPORTED_VG */
93 1.1 haad vg_check_status(vg, EXPORTED_VG);
94 1.1 haad
95 1.1 haad if (lvs_in_vg_activated_by_uuid_only(vg)) {
96 1.1 haad unlock_vg(cmd, vg_name_old);
97 1.1 haad log_error("Volume group \"%s\" still has active LVs",
98 1.1 haad vg_name_old);
99 1.1 haad /* FIXME Remove this restriction */
100 1.1 haad return 0;
101 1.1 haad }
102 1.1 haad
103 1.1 haad log_verbose("Checking for new volume group \"%s\"", vg_name_new);
104 1.1 haad
105 1.1 haad if (!lock_vol(cmd, vg_name_new, LCK_VG_WRITE | LCK_NONBLOCK)) {
106 1.1 haad unlock_vg(cmd, vg_name_old);
107 1.1 haad log_error("Can't get lock for %s", vg_name_new);
108 1.1 haad return 0;
109 1.1 haad }
110 1.1 haad
111 1.1 haad consistent = 0;
112 1.1 haad if ((vg_new = vg_read(cmd, vg_name_new, NULL, &consistent))) {
113 1.1 haad log_error("New volume group \"%s\" already exists",
114 1.1 haad vg_name_new);
115 1.1 haad goto error;
116 1.1 haad }
117 1.1 haad
118 1.1 haad if (!archive(vg))
119 1.1 haad goto error;
120 1.1 haad
121 1.1 haad /* Remove references based on old name */
122 1.1 haad drop_cached_metadata(vg);
123 1.1 haad
124 1.1 haad /* Change the volume group name */
125 1.1 haad vg_rename(cmd, vg, vg_name_new);
126 1.1 haad
127 1.1.1.2 haad /* store it on disks */
128 1.1.1.2 haad log_verbose("Writing out updated volume group");
129 1.1.1.2 haad if (!vg_write(vg) || !vg_commit(vg)) {
130 1.1.1.2 haad goto error;
131 1.1.1.2 haad }
132 1.1.1.2 haad
133 1.1 haad sprintf(old_path, "%s%s", dev_dir, vg_name_old);
134 1.1 haad sprintf(new_path, "%s%s", dev_dir, vg_name_new);
135 1.1 haad
136 1.1 haad if (activation() && dir_exists(old_path)) {
137 1.1 haad log_verbose("Renaming \"%s\" to \"%s\"", old_path, new_path);
138 1.1.1.2 haad
139 1.1 haad if (test_mode())
140 1.1 haad log_verbose("Test mode: Skipping rename.");
141 1.1 haad
142 1.1.1.2 haad else if (lvs_in_vg_activated_by_uuid_only(vg)) {
143 1.1.1.2 haad if (!vg_refresh_visible(cmd, vg)) {
144 1.1.1.2 haad log_error("Renaming \"%s\" to \"%s\" failed",
145 1.1.1.2 haad old_path, new_path);
146 1.1.1.2 haad goto error;
147 1.1.1.2 haad }
148 1.1.1.2 haad }
149 1.1 haad }
150 1.1 haad
151 1.1 haad /******* FIXME Rename any active LVs! *****/
152 1.1 haad
153 1.1 haad backup(vg);
154 1.1 haad
155 1.1 haad unlock_vg(cmd, vg_name_new);
156 1.1 haad unlock_vg(cmd, vg_name_old);
157 1.1 haad
158 1.1 haad log_print("Volume group \"%s\" successfully renamed to \"%s\"",
159 1.1 haad vg_name_old, vg_name_new);
160 1.1 haad
161 1.1 haad /* FIXME lvmcache corruption - vginfo duplicated instead of renamed */
162 1.1 haad persistent_filter_wipe(cmd->filter);
163 1.1 haad lvmcache_destroy(cmd, 1);
164 1.1 haad
165 1.1 haad return 1;
166 1.1 haad
167 1.1 haad error:
168 1.1 haad unlock_vg(cmd, vg_name_new);
169 1.1 haad unlock_vg(cmd, vg_name_old);
170 1.1 haad return 0;
171 1.1 haad }
172 1.1 haad
173 1.1 haad int vgrename(struct cmd_context *cmd, int argc, char **argv)
174 1.1 haad {
175 1.1 haad if (argc != 2) {
176 1.1 haad log_error("Old and new volume group names need specifying");
177 1.1 haad return EINVALID_CMD_LINE;
178 1.1 haad }
179 1.1 haad
180 1.1 haad if (!vg_rename_path(cmd, argv[0], argv[1]))
181 1.1 haad return ECMD_FAILED;
182 1.1 haad
183 1.1 haad return ECMD_PROCESSED;
184 1.1 haad }
185 1.1 haad
186