2001-10-11 18:10:18 +04:00
/*
* Copyright ( C ) 2001 Sistina Software ( UK ) Limited .
*
2001-10-31 15:47:01 +03:00
* This file is released under the LGPL .
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 "pool.h"
# 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 * pvh ;
struct list all_pvs ;
2001-10-11 18:10:18 +04:00
struct disk_list * dl ;
struct pool * mem = pool_create ( 10 * 1024 ) ;
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 ) ) ;
2001-10-31 15:47:01 +03:00
list_iterate ( pvh , & all_pvs ) {
dl = list_item ( pvh , struct disk_list ) ;
2002-04-24 22:20:51 +04:00
if ( ! * dl - > pvd . vg_name | | ! strcmp ( 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 :
2001-10-11 18:10:18 +04:00
pool_destroy ( mem ) ;
return r ;
}