Home | History | Annotate | Line # | Download | only in tools
vgrename.c revision 1.1.1.1.2.1
      1  1.1.1.1.2.1   jym /*	$NetBSD: vgrename.c,v 1.1.1.1.2.1 2009/05/13 18:52:48 jym 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.1.2.1   jym 	/* store it on disks */
    128  1.1.1.1.2.1   jym 	log_verbose("Writing out updated volume group");
    129  1.1.1.1.2.1   jym 	if (!vg_write(vg) || !vg_commit(vg)) {
    130  1.1.1.1.2.1   jym 		goto error;
    131  1.1.1.1.2.1   jym 	}
    132  1.1.1.1.2.1   jym 
    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.1.2.1   jym 
    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.1.2.1   jym 		else if (lvs_in_vg_activated_by_uuid_only(vg)) {
    143  1.1.1.1.2.1   jym 			if (!vg_refresh_visible(cmd, vg)) {
    144  1.1.1.1.2.1   jym 				log_error("Renaming \"%s\" to \"%s\" failed",
    145  1.1.1.1.2.1   jym 					old_path, new_path);
    146  1.1.1.1.2.1   jym 				goto error;
    147  1.1.1.1.2.1   jym 			}
    148  1.1.1.1.2.1   jym 		}
    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