1 /* $NetBSD: vg_number.c,v 1.1.1.1 2008/12/22 00:17:58 haad Exp $ */ 2 3 /* 4 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. 5 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 6 * 7 * This file is part of LVM2. 8 * 9 * This copyrighted material is made available to anyone wishing to use, 10 * modify, copy, or redistribute it subject to the terms and conditions 11 * of the GNU Lesser General Public License v.2.1. 12 * 13 * You should have received a copy of the GNU Lesser General Public License 14 * along with this program; if not, write to the Free Software Foundation, 15 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 */ 17 18 #include "lib.h" 19 #include "disk-rep.h" 20 21 /* 22 * FIXME: Quick hack. We can use caching to 23 * prevent a total re-read, even so vg_number 24 * causes the tools to check *every* pv. Yuck. 25 * Put in separate file so it wouldn't contaminate 26 * other code. 27 */ 28 int get_free_vg_number(struct format_instance *fid, struct dev_filter *filter, 29 const char *candidate_vg, int *result) 30 { 31 struct dm_list all_pvs; 32 struct disk_list *dl; 33 struct dm_pool *mem = dm_pool_create("lvm1 vg_number", 10 * 1024); 34 int numbers[MAX_VG], i, r = 0; 35 36 dm_list_init(&all_pvs); 37 38 if (!mem) 39 return_0; 40 41 if (!read_pvs_in_vg(fid->fmt, NULL, filter, mem, &all_pvs)) 42 goto_out; 43 44 memset(numbers, 0, sizeof(numbers)); 45 46 dm_list_iterate_items(dl, &all_pvs) { 47 if (!*dl->pvd.vg_name || !strcmp((char *)dl->pvd.vg_name, candidate_vg)) 48 continue; 49 50 numbers[dl->vgd.vg_number] = 1; 51 } 52 53 for (i = 0; i < MAX_VG; i++) { 54 if (!numbers[i]) { 55 r = 1; 56 *result = i; 57 break; 58 } 59 } 60 61 out: 62 dm_pool_destroy(mem); 63 return r; 64 } 65