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 .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2007 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
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2002-11-18 17:04:08 +03:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser 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 ;
}
2006-04-06 02:24:16 +04:00
/* Is there a pv here already? */
/* If not, this is an error unless you used -f. */
if ( ! ( pv = pv_read ( cmd , name , NULL , NULL , 1 ) ) ) {
if ( arg_count ( cmd , force_ARG ) )
return 1 ;
2006-12-13 21:40:23 +03:00
log_error ( " Physical Volume %s not found " , name ) ;
return 0 ;
2006-04-06 02:24:16 +04:00
}
2002-11-18 17:04:08 +03:00
/* orphan ? */
2007-06-14 19:51:36 +04:00
if ( is_orphan ( pv ) )
2002-11-18 17:04:08 +03:00
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 "
2007-06-16 02:16:55 +04:00
" volume group \" %s \" without -ff " , name , pv_vg_name ( pv ) ) ;
2002-11-18 17:04:08 +03:00
return 0 ;
}
/* prompt */
if ( ! arg_count ( cmd , yes_ARG ) & &
2007-06-16 02:16:55 +04:00
yes_no_prompt ( _really_wipe , name , pv_vg_name ( pv ) ) = = ' n ' ) {
2002-11-18 17:04:08 +03:00
log_print ( " %s: physical volume label not removed " , name ) ;
return 0 ;
}
if ( arg_count ( cmd , force_ARG ) ) {
2007-06-28 21:33:44 +04:00
log_warn ( " WARNING: Wiping physical volume label from "
2002-11-18 17:04:08 +03:00
" %s%s%s%s " , name ,
2007-06-14 19:48:05 +04:00
! is_orphan ( pv ) ? " of volume group \" " : " " ,
2007-06-16 02:16:55 +04:00
! is_orphan ( pv ) ? pv_vg_name ( pv ) : " " ,
2007-06-14 19:48:05 +04:00
! is_orphan ( pv ) ? " \" " : " " ) ;
2002-11-18 17:04:08 +03:00
}
return 1 ;
}
2003-10-22 02:06:07 +04:00
static int pvremove_single ( struct cmd_context * cmd , const char * pv_name ,
2006-05-10 01:23:51 +04:00
void * handle __attribute ( ( unused ) ) )
2002-11-18 17:04:08 +03:00
{
struct device * dev ;
2007-11-02 23:40:05 +03:00
int ret = ECMD_FAILED ;
2002-11-18 17:04:08 +03:00
2007-11-02 23:40:05 +03:00
if ( ! lock_vol ( cmd , VG_ORPHANS , 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 ) ) {
2006-11-17 05:45:51 +03:00
log_error ( " Can't open %s exclusively - not removing. "
" Mounted filesystem? " , dev_name ( dev ) ) ;
goto error ;
2005-10-04 01:10:41 +04:00
}
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 ) ;
2007-11-02 23:40:05 +03:00
ret = ECMD_PROCESSED ;
2003-10-22 02:06:07 +04:00
2002-11-18 17:04:08 +03:00
error :
2007-11-02 23:40:05 +03:00
unlock_vg ( cmd , VG_ORPHANS ) ;
return ret ;
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
}