1 1.1 haad /* $NetBSD: vgrename.c,v 1.1.1.3 2009/12/02 00:25:58 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.1.3 haad * Copyright (C) 2004-2009 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.1.3 haad static struct volume_group *vg_rename_old(struct cmd_context *cmd, 21 1.1.1.3 haad const char *vg_name_old, 22 1.1.1.3 haad const char *vgid) 23 1.1.1.3 haad { 24 1.1.1.3 haad struct volume_group *vg; 25 1.1.1.3 haad 26 1.1.1.3 haad /* FIXME we used to print an error about EXPORTED, but proceeded 27 1.1.1.3 haad nevertheless. */ 28 1.1.1.3 haad vg = vg_read_for_update(cmd, vg_name_old, vgid, READ_ALLOW_EXPORTED); 29 1.1.1.3 haad if (vg_read_error(vg)) { 30 1.1.1.3 haad vg_release(vg); 31 1.1.1.3 haad return_NULL; 32 1.1.1.3 haad } 33 1.1.1.3 haad 34 1.1.1.3 haad if (lvs_in_vg_activated_by_uuid_only(vg)) { 35 1.1.1.3 haad unlock_and_release_vg(cmd, vg, vg_name_old); 36 1.1.1.3 haad log_error("Volume group \"%s\" still has active LVs", 37 1.1.1.3 haad vg_name_old); 38 1.1.1.3 haad /* FIXME Remove this restriction */ 39 1.1.1.3 haad return NULL; 40 1.1.1.3 haad } 41 1.1.1.3 haad return vg; 42 1.1.1.3 haad } 43 1.1.1.3 haad 44 1.1.1.3 haad static int vg_rename_new(struct cmd_context *cmd, 45 1.1.1.3 haad const char *vg_name_new) 46 1.1.1.3 haad { 47 1.1.1.3 haad int rc; 48 1.1.1.3 haad 49 1.1.1.3 haad log_verbose("Checking for new volume group \"%s\"", vg_name_new); 50 1.1.1.3 haad 51 1.1.1.3 haad rc = vg_lock_newname(cmd, vg_name_new); 52 1.1.1.3 haad 53 1.1.1.3 haad if (rc == FAILED_LOCKING) { 54 1.1.1.3 haad log_error("Can't get lock for %s", vg_name_new); 55 1.1.1.3 haad return 0; 56 1.1.1.3 haad } 57 1.1.1.3 haad 58 1.1.1.3 haad if (rc == FAILED_EXIST) { 59 1.1.1.3 haad log_error("New volume group \"%s\" already exists", 60 1.1.1.3 haad vg_name_new); 61 1.1.1.3 haad return 0; 62 1.1.1.3 haad } 63 1.1.1.3 haad return 1; 64 1.1.1.3 haad } 65 1.1.1.3 haad 66 1.1 haad static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path, 67 1.1 haad const char *new_vg_path) 68 1.1 haad { 69 1.1 haad char *dev_dir; 70 1.1 haad struct id id; 71 1.1 haad int match = 0; 72 1.1 haad int found_id = 0; 73 1.1 haad struct dm_list *vgids; 74 1.1 haad struct str_list *sl; 75 1.1 haad char *vg_name_new; 76 1.1 haad const char *vgid = NULL, *vg_name, *vg_name_old; 77 1.1 haad char old_path[NAME_LEN], new_path[NAME_LEN]; 78 1.1.1.3 haad struct volume_group *vg = NULL; 79 1.1.1.3 haad int lock_vg_old_first = 1; 80 1.1 haad 81 1.1 haad vg_name_old = skip_dev_dir(cmd, old_vg_path, NULL); 82 1.1 haad vg_name_new = skip_dev_dir(cmd, new_vg_path, NULL); 83 1.1 haad 84 1.1 haad dev_dir = cmd->dev_dir; 85 1.1 haad 86 1.1 haad if (!validate_vg_rename_params(cmd, vg_name_old, vg_name_new)) 87 1.1 haad return 0; 88 1.1 haad 89 1.1 haad log_verbose("Checking for existing volume group \"%s\"", vg_name_old); 90 1.1 haad 91 1.1 haad /* Avoid duplicates */ 92 1.1 haad if (!(vgids = get_vgids(cmd, 0)) || dm_list_empty(vgids)) { 93 1.1 haad log_error("No complete volume groups found"); 94 1.1 haad return 0; 95 1.1 haad } 96 1.1 haad 97 1.1 haad dm_list_iterate_items(sl, vgids) { 98 1.1 haad vgid = sl->str; 99 1.1 haad if (!vgid || !(vg_name = vgname_from_vgid(NULL, vgid)) || 100 1.1 haad is_orphan_vg(vg_name)) 101 1.1 haad continue; 102 1.1 haad if (!strcmp(vg_name, vg_name_old)) { 103 1.1 haad if (match) { 104 1.1 haad log_error("Found more than one VG called %s. " 105 1.1 haad "Please supply VG uuid.", vg_name_old); 106 1.1 haad return 0; 107 1.1 haad } 108 1.1 haad match = 1; 109 1.1 haad } 110 1.1 haad } 111 1.1 haad 112 1.1 haad log_suppress(2); 113 1.1 haad found_id = id_read_format(&id, vg_name_old); 114 1.1 haad log_suppress(0); 115 1.1 haad if (found_id && (vg_name = vgname_from_vgid(cmd->mem, (char *)id.uuid))) { 116 1.1 haad vg_name_old = vg_name; 117 1.1 haad vgid = (char *)id.uuid; 118 1.1 haad } else 119 1.1 haad vgid = NULL; 120 1.1 haad 121 1.1.1.3 haad if (strcmp(vg_name_new, vg_name_old) < 0) 122 1.1.1.3 haad lock_vg_old_first = 0; 123 1.1 haad 124 1.1.1.3 haad if (lock_vg_old_first) { 125 1.1.1.3 haad vg = vg_rename_old(cmd, vg_name_old, vgid); 126 1.1.1.3 haad if (!vg) 127 1.1.1.3 haad return 0; 128 1.1.1.3 haad 129 1.1.1.3 haad if (!vg_rename_new(cmd, vg_name_new)) { 130 1.1.1.3 haad unlock_and_release_vg(cmd, vg, vg_name_old); 131 1.1.1.3 haad return 0; 132 1.1.1.3 haad } 133 1.1.1.3 haad } else { 134 1.1.1.3 haad if (!vg_rename_new(cmd, vg_name_new)) { 135 1.1.1.3 haad return 0; 136 1.1.1.3 haad } 137 1.1 haad 138 1.1.1.3 haad vg = vg_rename_old(cmd, vg_name_old, vgid); 139 1.1.1.3 haad if (!vg) 140 1.1.1.3 haad return 0; 141 1.1 haad } 142 1.1 haad 143 1.1 haad if (!archive(vg)) 144 1.1 haad goto error; 145 1.1 haad 146 1.1 haad /* Remove references based on old name */ 147 1.1 haad drop_cached_metadata(vg); 148 1.1 haad 149 1.1 haad /* Change the volume group name */ 150 1.1 haad vg_rename(cmd, vg, vg_name_new); 151 1.1 haad 152 1.1.1.2 haad /* store it on disks */ 153 1.1.1.2 haad log_verbose("Writing out updated volume group"); 154 1.1.1.2 haad if (!vg_write(vg) || !vg_commit(vg)) { 155 1.1.1.2 haad goto error; 156 1.1.1.2 haad } 157 1.1.1.2 haad 158 1.1 haad sprintf(old_path, "%s%s", dev_dir, vg_name_old); 159 1.1 haad sprintf(new_path, "%s%s", dev_dir, vg_name_new); 160 1.1 haad 161 1.1 haad if (activation() && dir_exists(old_path)) { 162 1.1 haad log_verbose("Renaming \"%s\" to \"%s\"", old_path, new_path); 163 1.1.1.2 haad 164 1.1 haad if (test_mode()) 165 1.1 haad log_verbose("Test mode: Skipping rename."); 166 1.1 haad 167 1.1.1.2 haad else if (lvs_in_vg_activated_by_uuid_only(vg)) { 168 1.1.1.2 haad if (!vg_refresh_visible(cmd, vg)) { 169 1.1.1.2 haad log_error("Renaming \"%s\" to \"%s\" failed", 170 1.1.1.2 haad old_path, new_path); 171 1.1.1.2 haad goto error; 172 1.1.1.2 haad } 173 1.1.1.2 haad } 174 1.1 haad } 175 1.1 haad 176 1.1 haad /******* FIXME Rename any active LVs! *****/ 177 1.1 haad 178 1.1 haad backup(vg); 179 1.1.1.3 haad backup_remove(cmd, vg_name_old); 180 1.1 haad 181 1.1 haad unlock_vg(cmd, vg_name_new); 182 1.1.1.3 haad unlock_and_release_vg(cmd, vg, vg_name_old); 183 1.1 haad 184 1.1 haad log_print("Volume group \"%s\" successfully renamed to \"%s\"", 185 1.1 haad vg_name_old, vg_name_new); 186 1.1 haad 187 1.1 haad /* FIXME lvmcache corruption - vginfo duplicated instead of renamed */ 188 1.1 haad persistent_filter_wipe(cmd->filter); 189 1.1 haad lvmcache_destroy(cmd, 1); 190 1.1 haad 191 1.1 haad return 1; 192 1.1 haad 193 1.1 haad error: 194 1.1.1.3 haad if (lock_vg_old_first) { 195 1.1.1.3 haad unlock_vg(cmd, vg_name_new); 196 1.1.1.3 haad unlock_and_release_vg(cmd, vg, vg_name_old); 197 1.1.1.3 haad } else { 198 1.1.1.3 haad unlock_and_release_vg(cmd, vg, vg_name_old); 199 1.1.1.3 haad unlock_vg(cmd, vg_name_new); 200 1.1.1.3 haad } 201 1.1 haad return 0; 202 1.1 haad } 203 1.1 haad 204 1.1 haad int vgrename(struct cmd_context *cmd, int argc, char **argv) 205 1.1 haad { 206 1.1 haad if (argc != 2) { 207 1.1 haad log_error("Old and new volume group names need specifying"); 208 1.1 haad return EINVALID_CMD_LINE; 209 1.1 haad } 210 1.1 haad 211 1.1.1.3 haad if (!vg_rename_path(cmd, argv[0], argv[1])) { 212 1.1.1.3 haad stack; 213 1.1 haad return ECMD_FAILED; 214 1.1.1.3 haad } 215 1.1.1.3 haad 216 1.1 haad return ECMD_PROCESSED; 217 1.1 haad } 218 1.1 haad 219