2001-10-11 18:10:18 +04:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2001-10-11 18:10:18 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
*
* 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 .
2004-03-30 23:35:44 +04: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
2001-10-11 18:10:18 +04:00
*/
2002-11-18 17:01:16 +03:00
# include "lib.h"
2001-10-11 18:10:18 +04:00
# include "disk-rep.h"
/*
* FIXME : Quick hack . We can use caching to
* prevent a total re - read , even so vg_number
* causes the tools to check * every * pv . Yuck .
2002-01-23 18:50:34 +03:00
* Put in separate file so it wouldn ' t contaminate
2001-10-11 18:10:18 +04:00
* other code .
*/
2002-04-24 22:20:51 +04:00
int get_free_vg_number ( struct format_instance * fid , struct dev_filter * filter ,
const char * candidate_vg , int * result )
2001-10-11 18:10:18 +04:00
{
2001-10-31 15:47:01 +03:00
struct list all_pvs ;
2001-10-11 18:10:18 +04:00
struct disk_list * dl ;
2005-10-17 03:03:59 +04:00
struct dm_pool * mem = dm_pool_create ( " lvm1 vg_number " , 10 * 1024 ) ;
2001-10-11 18:10:18 +04:00
int numbers [ MAX_VG ] , i , r = 0 ;
2001-10-31 15:47:01 +03:00
list_init ( & all_pvs ) ;
2001-10-11 18:21:38 +04:00
2001-10-11 18:10:18 +04:00
if ( ! mem ) {
stack ;
return 0 ;
}
2002-04-24 22:20:51 +04:00
if ( ! read_pvs_in_vg ( fid - > fmt , NULL , filter , mem , & all_pvs ) ) {
2001-10-11 18:10:18 +04:00
stack ;
goto out ;
}
memset ( numbers , 0 , sizeof ( numbers ) ) ;
2005-06-01 20:51:55 +04:00
list_iterate_items ( dl , & all_pvs ) {
2006-05-10 01:23:51 +04:00
if ( ! * dl - > pvd . vg_name | | ! strcmp ( ( char * ) dl - > pvd . vg_name , candidate_vg ) )
2001-10-11 18:10:18 +04:00
continue ;
2001-10-31 20:59:52 +03:00
numbers [ dl - > vgd . vg_number ] = 1 ;
2001-10-11 18:10:18 +04:00
}
for ( i = 0 ; i < MAX_VG ; i + + ) {
if ( ! numbers [ i ] ) {
r = 1 ;
* result = i ;
break ;
}
}
2002-04-24 22:20:51 +04:00
out :
2005-10-17 03:03:59 +04:00
dm_pool_destroy ( mem ) ;
2001-10-11 18:10:18 +04:00
return r ;
}