2001-10-03 21:03:25 +04:00
/*
* Copyright ( C ) 2001 Sistina Software
*
* LVM is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* LVM is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with LVM ; see the file COPYING . If not , write to
* the Free Software Foundation , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
*
*/
# include "tools.h"
2002-02-11 23:50:53 +03:00
int vgrename ( struct cmd_context * cmd , int argc , char * * argv )
2001-10-03 21:03:25 +04:00
{
2001-11-15 20:27:45 +03:00
char * dev_dir ;
2002-12-20 02:25:55 +03:00
unsigned int length ;
2002-11-18 17:04:08 +03:00
int consistent = 1 ;
2001-10-08 22:44:22 +04:00
char * vg_name_old , * vg_name_new ;
char old_path [ NAME_LEN ] , new_path [ NAME_LEN ] ;
2001-10-03 21:03:25 +04:00
struct volume_group * vg_old , * vg_new ;
if ( argc ! = 2 ) {
2001-11-27 20:02:24 +03:00
log_error ( " Old and new volume group names need specifying " ) ;
2001-10-05 02:53:37 +04:00
return EINVALID_CMD_LINE ;
2001-10-03 21:03:25 +04:00
}
2001-10-08 22:44:22 +04:00
vg_name_old = argv [ 0 ] ;
vg_name_new = argv [ 1 ] ;
2001-10-03 21:03:25 +04:00
2002-02-11 23:50:53 +03:00
dev_dir = cmd - > dev_dir ;
2001-11-15 20:27:45 +03:00
length = strlen ( dev_dir ) ;
2001-10-03 21:03:25 +04:00
2001-11-15 20:27:45 +03:00
/* If present, strip dev_dir */
if ( ! strncmp ( vg_name_old , dev_dir , length ) )
2001-10-08 22:44:22 +04:00
vg_name_old + = length ;
2001-11-15 20:27:45 +03:00
if ( ! strncmp ( vg_name_new , dev_dir , length ) )
2001-10-08 22:44:22 +04:00
vg_name_new + = length ;
2001-10-03 21:03:25 +04:00
2001-10-08 22:44:22 +04: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 21:03:25 +04:00
" of %d! " , NAME_LEN - length - 2 ) ;
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2003-02-03 23:09:58 +03:00
if ( ! validate_name ( vg_name_new ) ) {
2003-09-15 19:01:00 +04:00
log_error ( " New volume group name \" %s \" is invalid " ,
2001-10-08 22:44:22 +04:00
vg_name_new ) ;
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2001-10-08 22:44:22 +04:00
if ( ! strcmp ( vg_name_old , vg_name_new ) ) {
log_error ( " Old and new volume group names must differ " ) ;
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2002-01-30 18:04:48 +03:00
log_verbose ( " Checking for existing volume group \" %s \" " , vg_name_old ) ;
2002-02-11 18:42:34 +03:00
2002-02-27 15:26:41 +03:00
if ( ! lock_vol ( cmd , vg_name_old , LCK_VG_WRITE ) ) {
2002-02-12 00:00:35 +03:00
log_error ( " Can't get lock for %s " , vg_name_old ) ;
return ECMD_FAILED ;
}
2002-02-11 18:42:34 +03:00
2002-11-18 17:04:08 +03:00
if ( ! ( vg_old = vg_read ( cmd , vg_name_old , & consistent ) ) | | ! consistent ) {
2002-01-30 18:04:48 +03:00
log_error ( " Volume group \" %s \" doesn't exist " , vg_name_old ) ;
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_old ) ;
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2001-10-08 22:44:22 +04:00
2002-02-12 00:00:35 +03:00
if ( vg_old - > status & EXPORTED_VG ) {
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_old ) ;
2002-02-12 00:00:35 +03:00
log_error ( " Volume group \" %s \" is exported " , vg_old - > name ) ;
return ECMD_FAILED ;
}
2002-01-29 20:23:33 +03:00
if ( ! ( vg_old - > status & LVM_WRITE ) ) {
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_old ) ;
2002-01-30 18:04:48 +03:00
log_error ( " Volume group \" %s \" is read-only " , vg_old - > name ) ;
2002-01-29 20:23:33 +03:00
return ECMD_FAILED ;
}
2002-01-11 02:21:07 +03:00
if ( lvs_in_vg_activated ( vg_old ) ) {
2003-07-05 02:34:56 +04:00
unlock_vg ( cmd , vg_name_old ) ;
2002-01-30 18:04:48 +03:00
log_error ( " Volume group \" %s \" still has active LVs " ,
vg_name_old ) ;
2003-05-06 16:11:46 +04:00
/* FIXME Remove this restriction */
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2002-01-30 18:04:48 +03:00
log_verbose ( " Checking for new volume group \" %s \" " , vg_name_new ) ;
2002-02-11 18:42:34 +03:00
2002-02-27 15:26:41 +03:00
if ( ! lock_vol ( cmd , vg_name_new , LCK_VG_WRITE | LCK_NONBLOCK ) ) {
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 18:42:34 +03:00
log_error ( " Can't get lock for %s " , vg_name_new ) ;
return ECMD_FAILED ;
}
2002-11-18 17:04:08 +03:00
consistent = 0 ;
if ( ( vg_new = vg_read ( cmd , vg_name_new , & consistent ) ) ) {
2002-01-30 18:04:48 +03:00
log_error ( " New volume group \" %s \" already exists " ,
vg_name_new ) ;
2002-02-11 18:42:34 +03:00
goto error ;
2001-10-03 21:03:25 +04:00
}
2002-01-09 16:17:14 +03:00
if ( ! archive ( vg_old ) )
2002-02-11 18:42:34 +03:00
goto error ;
2002-01-09 16:17:14 +03:00
2001-10-08 22:44:22 +04:00
/* Change the volume group name */
2002-12-20 02:25:55 +03:00
vg_rename ( cmd , vg_old , vg_name_new ) ;
2001-10-03 21:03:25 +04:00
2001-11-15 20:27:45 +03:00
sprintf ( old_path , " %s%s " , dev_dir , vg_name_old ) ;
sprintf ( new_path , " %s%s " , dev_dir , vg_name_new ) ;
2001-10-03 21:03:25 +04:00
2002-02-11 18:42:34 +03:00
if ( dir_exists ( old_path ) ) {
log_verbose ( " Renaming \" %s \" to \" %s \" " , old_path , new_path ) ;
2002-11-18 17:04:08 +03:00
if ( test_mode ( ) )
log_verbose ( " Test mode: Skipping rename. " ) ;
else if ( rename ( old_path , new_path ) ) {
2002-02-11 18:42:34 +03:00
log_error ( " Renaming \" %s \" to \" %s \" failed: %s " ,
2002-02-12 00:00:35 +03:00
old_path , new_path , strerror ( errno ) ) ;
2002-02-11 18:42:34 +03:00
goto error ;
}
2001-10-03 21:03:25 +04:00
}
/* store it on disks */
2001-10-08 22:44:22 +04:00
log_verbose ( " Writing out updated volume group " ) ;
2003-07-05 02:34:56 +04:00
if ( ! vg_write ( vg_old ) | | ! vg_commit ( vg_old ) ) {
2002-02-11 18:42:34 +03:00
goto error ;
2001-10-03 21:03:25 +04:00
}
2002-02-11 18:42:34 +03:00
/******* FIXME Rename any active LVs! *****/
2001-11-21 22:32:35 +03:00
2002-01-07 14:12:11 +03:00
backup ( vg_old ) ;
2001-10-03 21:03:25 +04:00
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_new ) ;
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 18:42:34 +03:00
2002-01-30 18:04:48 +03:00
log_print ( " Volume group \" %s \" successfully renamed to \" %s \" " ,
2001-10-03 21:03:25 +04:00
vg_name_old , vg_name_new ) ;
2003-10-22 02:06:07 +04:00
return ECMD_PROCESSED ;
2002-02-11 18:42:34 +03:00
error :
2002-03-11 18:08:39 +03:00
unlock_vg ( cmd , vg_name_new ) ;
unlock_vg ( cmd , vg_name_old ) ;
2002-02-11 18:42:34 +03:00
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}