2001-10-01 15:29:39 +00:00
/*
2001-10-12 10:32:06 +00:00
* Copyright ( C ) 2001 Sistina Software ( UK ) Limited .
2001-10-01 15:29:39 +00:00
*
2001-10-12 10:32:06 +00:00
* This file is released under the GPL .
2001-10-01 15:29:39 +00:00
*/
# include "tools.h"
2001-10-12 10:32:06 +00:00
const char _really_init [ ] =
" Really INITIALIZE physical volume %s of volume group %s [y/n]? " ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/*
* See if we may pvcreate on this device .
* 0 indicates we may not .
*/
static int _check ( const char * name )
2001-10-01 15:29:39 +00:00
{
2001-10-12 10:32:06 +00:00
struct physical_volume * pv ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/* is the partition type set correctly ? */
if ( ( arg_count ( force_ARG ) < 1 ) & & ! is_lvm_partition ( name ) )
return 0 ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/* is there a pv here already */
if ( ! ( pv = ios - > pv_read ( ios , name ) ) )
return 1 ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/* orphan ? */
if ( ! pv - > vg_name [ 0 ] )
return 1 ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/* never overwrite exported pv's */
if ( pv - > status & EXPORTED_VG ) {
log_error ( " Physical volume %s belongs to exported volume "
" group %s " , name , pv - > vg_name ) ;
return 0 ;
}
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
/* we must have -ff to overwrite a non orphan */
if ( arg_count ( force_ARG ) < 2 ) {
log_error ( " Can't initialize physical volume %s of "
" volume group %s without -ff " , name , pv - > vg_name ) ;
return 0 ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 10:32:06 +00:00
/* prompt */
if ( ! arg_count ( yes_ARG ) & &
yes_no_prompt ( _really_init , name , pv - > vg_name ) = = ' n ' ) {
2001-10-12 12:21:43 +00:00
log_print ( " Physical volume %s not initialized " , name ) ;
2001-10-12 10:32:06 +00:00
return 0 ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 10:32:06 +00:00
if ( pv - > status & ACTIVE ) {
log_error ( " Can't create on active physical volume %s " , name ) ;
return 0 ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 10:32:06 +00:00
return 1 ;
}
2001-10-12 10:43:36 +00:00
static void pvcreate_single ( const char * name )
2001-10-12 10:32:06 +00:00
{
struct physical_volume * pv ;
2001-10-01 22:12:10 +00:00
2001-10-12 10:32:06 +00:00
if ( arg_count ( force_ARG ) ) {
log_print ( " WARNING: forcing physical volume creation on %s " ,
name ) ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
if ( pv - > vg_name [ 0 ] )
log_print ( " of volume group %s " , pv - > vg_name ) ;
2001-10-12 12:21:43 +00:00
log_print ( " " ) ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 12:21:43 +00:00
if ( ! ( pv = pv_create ( ios , name ) ) ) {
2001-10-12 10:32:06 +00:00
log_err ( " Failed to setup physical volume %s " , name ) ;
2001-10-01 22:12:10 +00:00
return ;
}
2001-10-12 12:21:43 +00:00
log_verbose ( " Set up physical volume for %s with %llu sectors " ,
2001-10-12 10:32:06 +00:00
name , pv - > size ) ;
2001-10-01 22:12:10 +00:00
2001-10-01 15:29:39 +00:00
2001-10-12 12:21:43 +00:00
log_verbose ( " Writing physical volume data to disk %s " , name ) ;
2001-10-12 10:32:06 +00:00
if ( ! ( ios - > pv_write ( ios , pv ) ) ) {
log_error ( " Failed to write physical volume %s " , name ) ;
return ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 12:21:43 +00:00
log_print ( " Physical volume %s successfully created " , name ) ;
2001-10-12 10:32:06 +00:00
}
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
int pvcreate ( int argc , char * * argv )
{
int i ;
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
if ( ! argc ) {
log_error ( " Please enter a physical volume path " ) ;
return EINVALID_CMD_LINE ;
}
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
if ( arg_count ( yes_ARG ) & & ! arg_count ( force_ARG ) ) {
2001-10-12 12:21:43 +00:00
log_error ( " Option y can only be given with option f " ) ;
2001-10-12 10:32:06 +00:00
return EINVALID_CMD_LINE ;
2001-10-01 15:29:39 +00:00
}
2001-10-12 10:32:06 +00:00
for ( i = 0 ; i < argc ; i + + ) {
2001-10-12 10:45:04 +00:00
if ( ! _check ( argv [ i ] ) )
continue ;
2001-10-12 10:43:36 +00:00
pvcreate_single ( argv [ i ] ) ;
2001-10-12 10:32:06 +00:00
pool_empty ( ios - > mem ) ;
}
2001-10-01 15:29:39 +00:00
2001-10-12 10:32:06 +00:00
return 0 ;
2001-10-01 15:29:39 +00:00
}