Home | History | Annotate | Line # | Download | only in tools
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