2001-10-03 17:03:25 +00:00
/*
2004-03-30 19:35:44 +00:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
* Copyright ( C ) 2004 Red Hat , Inc . All rights reserved .
2001-10-03 17:03:25 +00:00
*
2004-03-30 19:35:44 +00:00
* This file is part of LVM2 .
2001-10-03 17:03:25 +00:00
*
2004-03-30 19:35:44 +00:00
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU General Public License v .2 .
2001-10-03 17:03:25 +00:00
*
* You should have received a copy of the GNU General Public License
2004-03-30 19:35:44 +00:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2001-10-03 17:03:25 +00:00
*/
# include "tools.h"
2002-02-11 20:50:53 +00:00
int vgrename ( struct cmd_context * cmd , int argc , char * * argv )
2001-10-03 17:03:25 +00:00
{
2001-11-15 17:27:45 +00:00
char * dev_dir ;
2006-05-09 21:23:51 +00:00
unsigned length ;
2006-04-13 21:08:29 +00:00
struct id id ;
2002-11-18 14:04:08 +00:00
int consistent = 1 ;
2006-04-13 21:08:29 +00:00
int match = 0 ;
int found_id = 0 ;
struct list * vgids ;
struct str_list * sl ;
char * vg_name_new ;
const char * vgid = NULL , * vg_name , * vg_name_old ;
2001-10-08 18:44:22 +00:00
char old_path [ NAME_LEN ] , new_path [ NAME_LEN ] ;
2001-10-03 17:03:25 +00:00
struct volume_group * vg_old , * vg_new ;
if ( argc ! = 2 ) {
2001-11-27 17:02:24 +00:00
log_error ( " Old and new volume group names need specifying " ) ;
2001-10-04 22:53:37 +00:00
return EINVALID_CMD_LINE ;
2001-10-03 17:03:25 +00:00
}
2007-03-09 20:47:41 +00:00
vg_name_old = skip_dev_dir ( cmd , argv [ 0 ] , NULL ) ;
vg_name_new = skip_dev_dir ( cmd , argv [ 1 ] , NULL ) ;
2001-10-03 17:03:25 +00:00
2002-02-11 20:50:53 +00:00
dev_dir = cmd - > dev_dir ;
2001-11-15 17:27:45 +00:00
length = strlen ( dev_dir ) ;
2001-10-03 17:03:25 +00:00
2001-10-08 18:44:22 +00:00
/* Check sanity of new name */
if ( strlen ( vg_name_new ) > NAME_LEN - length - 2 ) {
log_error ( " New volume group path exceeds maximum length "
2001-10-03 17:03:25 +00:00
" of %d! " , NAME_LEN - length - 2 ) ;
2001-10-04 22:53:37 +00:00
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}
2005-06-06 18:16:33 +00:00
if ( ! validate_vg_name ( cmd , vg_name_new ) ) {
2003-09-15 15:01:00 +00:00
log_error ( " New volume group name \" %s \" is invalid " ,
2001-10-08 18:44:22 +00:00
vg_name_new ) ;
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}
2001-10-08 18:44:22 +00:00
if ( ! strcmp ( vg_name_old , vg_name_new ) ) {
log_error ( " Old and new volume group names must differ " ) ;
2001-10-04 22:53:37 +00:00
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}
2002-01-30 15:04:48 +00:00
log_verbose ( " Checking for existing volume group \" %s \" " , vg_name_old ) ;
2002-02-11 15:42:34 +00:00
2006-04-13 21:08:29 +00:00
/* Avoid duplicates */
if ( ! ( vgids = get_vgids ( cmd , 0 ) ) | | list_empty ( vgids ) ) {
log_error ( " No complete volume groups found " ) ;
2002-02-11 21:00:35 +00:00
return ECMD_FAILED ;
}
2002-02-11 15:42:34 +00:00
2006-04-13 21:08:29 +00:00
list_iterate_items ( sl , vgids ) {
vgid = sl - > str ;
if ( ! vgid | | ! ( vg_name = vgname_from_vgid ( NULL , vgid ) ) | | ! * vg_name )
continue ;
if ( ! strcmp ( vg_name , vg_name_old ) ) {
if ( match ) {
log_error ( " Found more than one VG called %s. "
" Please supply VG uuid. " , vg_name_old ) ;
return ECMD_FAILED ;
}
match = 1 ;
}
}
log_suppress ( 2 ) ;
found_id = id_read_format ( & id , vg_name_old ) ;
log_suppress ( 0 ) ;
2006-05-09 21:23:51 +00:00
if ( found_id & & ( vg_name = vgname_from_vgid ( cmd - > mem , ( char * ) id . uuid ) ) ) {
2006-04-13 21:08:29 +00:00
vg_name_old = vg_name ;
2006-05-09 21:23:51 +00:00
vgid = ( char * ) id . uuid ;
2006-04-13 21:08:29 +00:00
} else
vgid = NULL ;
if ( ! lock_vol ( cmd , vg_name_old , LCK_VG_WRITE ) ) {
log_error ( " Can't get lock for %s " , vg_name_old ) ;
2001-10-04 22:53:37 +00:00
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}
2001-10-08 18:44:22 +00:00
2006-04-13 21:08:29 +00:00
if ( ! ( vg_old = vg_read ( cmd , vg_name_old , vgid , & consistent ) ) | | ! consistent ) {
log_error ( " Volume group %s %s%s%snot found. " , vg_name_old ,
vgid ? " ( " : " " , vgid ? vgid : " " , vgid ? " ) " : " " ) ;
2002-03-11 15:08:39 +00:00
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 21:00:35 +00:00
return ECMD_FAILED ;
2006-09-02 01:18:17 +00:00
}
2007-06-06 19:40:28 +00:00
if ( ! vg_check_status ( vg_old , CLUSTERED | LVM_WRITE ) ) {
2006-09-02 01:18:17 +00:00
unlock_vg ( cmd , vg_name_old ) ;
return ECMD_FAILED ;
2002-02-11 21:00:35 +00:00
}
2002-01-29 17:23:33 +00:00
2007-06-06 19:40:28 +00:00
/* Don't return failure for EXPORTED_VG */
vg_check_status ( vg_old , EXPORTED_VG ) ;
2002-01-29 17:23:33 +00:00
2007-03-08 21:08:25 +00:00
if ( lvs_in_vg_activated_by_uuid_only ( vg_old ) ) {
2003-07-04 22:34:56 +00:00
unlock_vg ( cmd , vg_name_old ) ;
2002-01-30 15:04:48 +00:00
log_error ( " Volume group \" %s \" still has active LVs " ,
vg_name_old ) ;
2003-05-06 12:11:46 +00:00
/* FIXME Remove this restriction */
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}
2002-01-30 15:04:48 +00:00
log_verbose ( " Checking for new volume group \" %s \" " , vg_name_new ) ;
2002-02-11 15:42:34 +00:00
2002-02-27 12:26:41 +00:00
if ( ! lock_vol ( cmd , vg_name_new , LCK_VG_WRITE | LCK_NONBLOCK ) ) {
2002-03-11 15:08:39 +00:00
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 15:42:34 +00:00
log_error ( " Can't get lock for %s " , vg_name_new ) ;
return ECMD_FAILED ;
}
2002-11-18 14:04:08 +00:00
consistent = 0 ;
2006-04-12 21:23:04 +00:00
if ( ( vg_new = vg_read ( cmd , vg_name_new , NULL , & consistent ) ) ) {
2002-01-30 15:04:48 +00:00
log_error ( " New volume group \" %s \" already exists " ,
vg_name_new ) ;
2002-02-11 15:42:34 +00:00
goto error ;
2001-10-03 17:03:25 +00:00
}
2002-01-09 13:17:14 +00:00
if ( ! archive ( vg_old ) )
2002-02-11 15:42:34 +00:00
goto error ;
2002-01-09 13:17:14 +00:00
2001-10-08 18:44:22 +00:00
/* Change the volume group name */
2002-12-19 23:25:55 +00:00
vg_rename ( cmd , vg_old , vg_name_new ) ;
2001-10-03 17:03:25 +00:00
2001-11-15 17:27:45 +00:00
sprintf ( old_path , " %s%s " , dev_dir , vg_name_old ) ;
sprintf ( new_path , " %s%s " , dev_dir , vg_name_new ) ;
2001-10-03 17:03:25 +00:00
2002-02-11 15:42:34 +00:00
if ( dir_exists ( old_path ) ) {
log_verbose ( " Renaming \" %s \" to \" %s \" " , old_path , new_path ) ;
2002-11-18 14:04:08 +00:00
if ( test_mode ( ) )
log_verbose ( " Test mode: Skipping rename. " ) ;
else if ( rename ( old_path , new_path ) ) {
2002-02-11 15:42:34 +00:00
log_error ( " Renaming \" %s \" to \" %s \" failed: %s " ,
2002-02-11 21:00:35 +00:00
old_path , new_path , strerror ( errno ) ) ;
2002-02-11 15:42:34 +00:00
goto error ;
}
2001-10-03 17:03:25 +00:00
}
/* store it on disks */
2001-10-08 18:44:22 +00:00
log_verbose ( " Writing out updated volume group " ) ;
2003-07-04 22:34:56 +00:00
if ( ! vg_write ( vg_old ) | | ! vg_commit ( vg_old ) ) {
2002-02-11 15:42:34 +00:00
goto error ;
2001-10-03 17:03:25 +00:00
}
2002-02-11 15:42:34 +00:00
/******* FIXME Rename any active LVs! *****/
2001-11-21 19:32:35 +00:00
2002-01-07 11:12:11 +00:00
backup ( vg_old ) ;
2001-10-03 17:03:25 +00:00
2002-03-11 15:08:39 +00:00
unlock_vg ( cmd , vg_name_new ) ;
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 15:42:34 +00:00
2002-01-30 15:04:48 +00:00
log_print ( " Volume group \" %s \" successfully renamed to \" %s \" " ,
2001-10-03 17:03:25 +00:00
vg_name_old , vg_name_new ) ;
2006-04-13 21:08:29 +00:00
/* FIXME lvmcache corruption - vginfo duplicated instead of renamed */
persistent_filter_wipe ( cmd - > filter ) ;
lvmcache_destroy ( ) ;
2003-10-21 22:06:07 +00:00
return ECMD_PROCESSED ;
2002-02-11 15:42:34 +00:00
error :
2002-03-11 15:08:39 +00:00
unlock_vg ( cmd , vg_name_new ) ;
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 15:42:34 +00:00
return ECMD_FAILED ;
2001-10-03 17:03:25 +00:00
}