2002-11-18 17:04:08 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2002 - 2004 Sistina Software , Inc . All rights reserved .
* Copyright ( C ) 2004 Red Hat , Inc . All rights reserved .
2002-11-18 17:04:08 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
2002-11-18 17:04:08 +03:00
*
2004-03-30 23:35:44 +04: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 .
2002-11-18 17:04:08 +03:00
*
* You should have received a copy of the GNU General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2002-11-18 17:04:08 +03:00
*/
# include "tools.h"
const char _really_wipe [ ] =
" Really WIPE LABELS from physical volume \" %s \" of volume group \" %s \" [y/n]? " ;
/*
* Decide whether it is " safe " to wipe the labels on this device .
* 0 indicates we may not .
*/
static int pvremove_check ( struct cmd_context * cmd , const char * name )
{
struct physical_volume * pv ;
/* is the partition type set correctly ? */
if ( ( arg_count ( cmd , force_ARG ) < 1 ) & & ! is_lvm_partition ( name ) ) {
log_error ( " %s: Not LVM partition type: use -f to override " ,
name ) ;
return 0 ;
}
/* is there a pv here already */
2004-06-19 23:27:00 +04:00
if ( ! ( pv = pv_read ( cmd , name , NULL , NULL , 1 ) ) )
2002-11-18 17:04:08 +03:00
return 1 ;
/* orphan ? */
if ( ! pv - > vg_name [ 0 ] )
return 1 ;
/* Allow partial & exported VGs to be destroyed. */
/* we must have -ff to overwrite a non orphan */
if ( arg_count ( cmd , force_ARG ) < 2 ) {
log_error ( " Can't pvremove physical volume \" %s \" of "
" volume group \" %s \" without -ff " , name , pv - > vg_name ) ;
return 0 ;
}
/* prompt */
if ( ! arg_count ( cmd , yes_ARG ) & &
yes_no_prompt ( _really_wipe , name , pv - > vg_name ) = = ' n ' ) {
log_print ( " %s: physical volume label not removed " , name ) ;
return 0 ;
}
if ( arg_count ( cmd , force_ARG ) ) {
log_print ( " WARNING: Wiping physical volume label from "
" %s%s%s%s " , name ,
pv - > vg_name [ 0 ] ? " of volume group \" " : " " ,
pv - > vg_name [ 0 ] ? pv - > vg_name : " " ,
pv - > vg_name [ 0 ] ? " \" " : " " ) ;
}
return 1 ;
}
2003-10-22 02:06:07 +04:00
static int pvremove_single ( struct cmd_context * cmd , const char * pv_name ,
void * handle )
2002-11-18 17:04:08 +03:00
{
struct device * dev ;
2005-10-03 22:16:44 +04:00
if ( ! lock_vol ( cmd , ORPHAN , LCK_VG_WRITE ) ) {
2002-11-18 17:04:08 +03:00
log_error ( " Can't get lock for orphan PVs " ) ;
2003-10-22 02:06:07 +04:00
return ECMD_FAILED ;
2002-11-18 17:04:08 +03:00
}
if ( ! pvremove_check ( cmd , pv_name ) )
goto error ;
if ( ! ( dev = dev_cache_get ( pv_name , cmd - > filter ) ) ) {
2004-09-14 18:54:58 +04:00
log_error ( " %s: Couldn't find device. Check your filters? " ,
pv_name ) ;
2002-11-18 17:04:08 +03:00
goto error ;
}
2005-10-04 01:10:41 +04:00
if ( ! dev_test_excl ( dev ) ) {
log_error ( " Can't open %s exclusively. Mounted filesystem? " ,
dev_name ( dev ) ) ;
return 0 ;
}
2002-11-18 17:04:08 +03:00
/* Wipe existing label(s) */
if ( ! label_remove ( dev ) ) {
log_error ( " Failed to wipe existing label(s) on %s " , pv_name ) ;
goto error ;
}
log_print ( " Labels on physical volume \" %s \" successfully wiped " ,
pv_name ) ;
2005-10-03 22:16:44 +04:00
unlock_vg ( cmd , ORPHAN ) ;
2003-10-22 02:06:07 +04:00
return ECMD_PROCESSED ;
2002-11-18 17:04:08 +03:00
error :
2005-10-03 22:16:44 +04:00
unlock_vg ( cmd , ORPHAN ) ;
2003-10-22 02:06:07 +04:00
return ECMD_FAILED ;
2002-11-18 17:04:08 +03:00
}
int pvremove ( struct cmd_context * cmd , int argc , char * * argv )
{
2003-10-22 02:06:07 +04:00
int i , r ;
int ret = ECMD_PROCESSED ;
2002-11-18 17:04:08 +03:00
if ( ! argc ) {
log_error ( " Please enter a physical volume path " ) ;
return EINVALID_CMD_LINE ;
}
if ( arg_count ( cmd , yes_ARG ) & & ! arg_count ( cmd , force_ARG ) ) {
log_error ( " Option y can only be given with option f " ) ;
return EINVALID_CMD_LINE ;
}
for ( i = 0 ; i < argc ; i + + ) {
2003-10-22 02:06:07 +04:00
r = pvremove_single ( cmd , argv [ i ] , NULL ) ;
if ( r > ret )
ret = r ;
2002-11-18 17:04:08 +03:00
}
2003-10-22 02:06:07 +04:00
return ret ;
2002-11-18 17:04:08 +03:00
}