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"
int vgrename ( int argc , char * * argv )
{
2001-11-15 20:27:45 +03:00
char * dev_dir ;
2001-10-08 22:44:22 +04:00
int length ;
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 ;
2001-10-31 15:47:01 +03:00
struct list * pvh ;
2001-10-03 21:03:25 +04:00
if ( argc ! = 2 ) {
2001-10-08 22:44:22 +04: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
2001-11-15 20:27:45 +03:00
dev_dir = fid - > cmd - > dev_dir ;
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
}
2001-10-08 22:44:22 +04:00
if ( ! is_valid_chars ( vg_name_new ) ) {
log_error ( " New volume group name %s has invalid characters " ,
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
}
2001-10-08 22:44:22 +04:00
log_verbose ( " Checking for existing volume group %s " , vg_name_old ) ;
2001-11-12 18:10:01 +03:00
if ( ! ( vg_old = fid - > ops - > vg_read ( fid , vg_name_old ) ) ) {
2001-10-08 22:44:22 +04:00
log_error ( " Volume group %s doesn't exist " , 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
2001-10-06 01:39:30 +04:00
if ( vg_old - > status & ACTIVE ) {
2001-10-03 21:03:25 +04:00
log_error ( " Volume group %s still active " , vg_name_old ) ;
2001-10-08 22:44:22 +04:00
if ( ! force_ARG ) {
log_error ( " Use -f to force the rename " ) ;
return ECMD_FAILED ;
}
2001-10-03 21:03:25 +04:00
}
2001-10-08 22:44:22 +04:00
log_verbose ( " Checking for new volume group %s " , vg_name_new ) ;
2001-11-12 18:10:01 +03:00
if ( ( vg_new = fid - > ops - > vg_read ( fid , vg_name_new ) ) ) {
2001-10-03 21:03:25 +04:00
log_error ( " New volume group %s already exists " , vg_name_new ) ;
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
/* Change the volume group name */
2001-10-03 21:03:25 +04:00
strcpy ( vg_old - > name , vg_name_new ) ;
2001-10-08 22:44:22 +04:00
/* FIXME Should vg_write fix these implicitly? It has to check them. */
2001-10-31 15:47:01 +03:00
list_iterate ( pvh , & vg_old - > pvs ) {
strcpy ( list_item ( pvh , struct pv_list ) - > pv . vg_name ,
2001-10-12 01:35:55 +04:00
vg_name_new ) ;
2001-10-08 22:44:22 +04:00
}
2001-10-03 21:03:25 +04:00
2001-10-08 22:44:22 +04:00
/********** FIXME: Check within vg_write now
2001-10-03 21:03:25 +04:00
log_error ( " A new logical volume path exceeds "
" maximum of %d! " , NAME_LEN - 2 ) ;
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-08 22:44:22 +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
2001-10-08 22:44:22 +04:00
log_verbose ( " Renaming %s to %s " , old_path , new_path ) ;
2001-10-10 20:36:32 +04:00
if ( rename ( old_path , new_path ) ) {
2001-10-08 22:44:22 +04:00
log_error ( " Renaming %s to %s failed: %s " ,
old_path , new_path , strerror ( errno ) ) ;
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
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 " ) ;
2001-11-12 18:10:01 +03:00
if ( ! ( fid - > ops - > vg_write ( fid , vg_old ) ) ) {
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-03 21:03:25 +04:00
}
2001-11-21 22:32:35 +03:00
/******* FIXME Any LV things to update? */
2001-10-08 22:44:22 +04:00
/***********
2001-10-03 21:03:25 +04:00
if ( ( ret = do_autobackup ( vg_name_new , vg_old ) ) )
2001-10-05 02:53:37 +04:00
return ECMD_FAILED ;
2001-10-08 22:44:22 +04:00
* * * * * * * * * */
2001-10-03 21:03:25 +04:00
log_print ( " Volume group %s successfully renamed to %s " ,
vg_name_old , vg_name_new ) ;
2001-10-08 22:44:22 +04:00
/* FIXME: Deallocations */
2001-10-03 21:03:25 +04:00
2001-10-08 22:44:22 +04:00
return 0 ;
2001-10-03 21:03:25 +04:00
}
2001-10-08 22:44:22 +04:00
/* FIXME: Moved into vg_write now */
/*******************
2001-10-03 21:03:25 +04:00
char * lv_change_vgname ( char * vg_name , char * lv_name )
{
char * lv_name_ptr = NULL ;
static char lv_name_buf [ NAME_LEN ] = { 0 , } ;
2001-10-08 22:44:22 +04:00
* * check if lv_name includes a path
2001-10-03 21:03:25 +04:00
if ( ( lv_name_ptr = strrchr ( lv_name , ' / ' ) ) ) {
2001-10-08 22:44:22 +04:00
lv_name_ptr + + ;
2001-11-12 18:10:01 +03:00
sprintf ( lv_name_buf , " %s%s/%s%c " , fid - > cmd - > dev_dir , vg_name ,
2001-10-08 22:44:22 +04:00
lv_name_ptr , 0 ) ; }
else
strncpy ( lv_name_buf , lv_name , NAME_LEN - 1 ) ; return lv_name_buf ; }
* * * * * * * * * * * * * * * * * * * * * */