Home | History | Annotate | Line # | Download | only in metadata
metadata.c revision 1.1.1.3
      1      1.1  haad /*	$NetBSD: metadata.c,v 1.1.1.3 2009/12/02 00:26:39 haad Exp $	*/
      2      1.1  haad 
      3      1.1  haad /*
      4      1.1  haad  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
      5  1.1.1.3  haad  * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
      6      1.1  haad  *
      7      1.1  haad  * This file is part of LVM2.
      8      1.1  haad  *
      9      1.1  haad  * This copyrighted material is made available to anyone wishing to use,
     10      1.1  haad  * modify, copy, or redistribute it subject to the terms and conditions
     11      1.1  haad  * of the GNU Lesser General Public License v.2.1.
     12      1.1  haad  *
     13      1.1  haad  * You should have received a copy of the GNU Lesser General Public License
     14      1.1  haad  * along with this program; if not, write to the Free Software Foundation,
     15      1.1  haad  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     16      1.1  haad  */
     17      1.1  haad 
     18      1.1  haad #include "lib.h"
     19      1.1  haad #include "device.h"
     20      1.1  haad #include "metadata.h"
     21      1.1  haad #include "toolcontext.h"
     22      1.1  haad #include "lvm-string.h"
     23      1.1  haad #include "lvm-file.h"
     24      1.1  haad #include "lvmcache.h"
     25      1.1  haad #include "memlock.h"
     26      1.1  haad #include "str_list.h"
     27      1.1  haad #include "pv_alloc.h"
     28  1.1.1.3  haad #include "segtype.h"
     29      1.1  haad #include "activate.h"
     30      1.1  haad #include "display.h"
     31      1.1  haad #include "locking.h"
     32      1.1  haad #include "archiver.h"
     33      1.1  haad #include "defaults.h"
     34  1.1.1.3  haad #include "filter-persistent.h"
     35      1.1  haad 
     36      1.1  haad #include <sys/param.h>
     37      1.1  haad 
     38      1.1  haad /*
     39      1.1  haad  * FIXME: Check for valid handle before dereferencing field or log error?
     40      1.1  haad  */
     41      1.1  haad #define pv_field(handle, field)				\
     42      1.1  haad 	(((const struct physical_volume *)(handle))->field)
     43      1.1  haad 
     44      1.1  haad static struct physical_volume *_pv_read(struct cmd_context *cmd,
     45  1.1.1.3  haad 					struct dm_pool *pvmem,
     46      1.1  haad 					const char *pv_name,
     47      1.1  haad 					struct dm_list *mdas,
     48      1.1  haad 					uint64_t *label_sector,
     49  1.1.1.3  haad 					int warnings, int scan_label_only);
     50      1.1  haad 
     51      1.1  haad static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
     52      1.1  haad 			 			const char *pv_name);
     53      1.1  haad 
     54      1.1  haad static struct pv_list *_find_pv_in_vg(const struct volume_group *vg,
     55      1.1  haad 				      const char *pv_name);
     56      1.1  haad 
     57      1.1  haad static struct physical_volume *_find_pv_in_vg_by_uuid(const struct volume_group *vg,
     58      1.1  haad 						      const struct id *id);
     59      1.1  haad 
     60  1.1.1.3  haad static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
     61  1.1.1.3  haad 				    uint32_t status);
     62  1.1.1.3  haad 
     63  1.1.1.3  haad const char _really_init[] =
     64  1.1.1.3  haad     "Really INITIALIZE physical volume \"%s\" of volume group \"%s\" [y/n]? ";
     65  1.1.1.3  haad 
     66  1.1.1.3  haad unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignment)
     67      1.1  haad {
     68      1.1  haad 	if (pv->pe_align)
     69      1.1  haad 		goto out;
     70      1.1  haad 
     71  1.1.1.3  haad 	if (data_alignment)
     72  1.1.1.3  haad 		pv->pe_align = data_alignment;
     73  1.1.1.3  haad 	else
     74  1.1.1.3  haad 		pv->pe_align = MAX(65536UL, lvm_getpagesize()) >> SECTOR_SHIFT;
     75      1.1  haad 
     76      1.1  haad 	if (!pv->dev)
     77      1.1  haad 		goto out;
     78      1.1  haad 
     79  1.1.1.3  haad 	/*
     80  1.1.1.3  haad 	 * Align to stripe-width of underlying md device if present
     81  1.1.1.3  haad 	 */
     82      1.1  haad 	if (find_config_tree_bool(pv->fmt->cmd, "devices/md_chunk_alignment",
     83      1.1  haad 				  DEFAULT_MD_CHUNK_ALIGNMENT))
     84      1.1  haad 		pv->pe_align = MAX(pv->pe_align,
     85  1.1.1.3  haad 				   dev_md_stripe_width(pv->fmt->cmd->sysfs_dir,
     86  1.1.1.3  haad 						       pv->dev));
     87  1.1.1.3  haad 
     88  1.1.1.3  haad 	/*
     89  1.1.1.3  haad 	 * Align to topology's minimum_io_size or optimal_io_size if present
     90  1.1.1.3  haad 	 * - minimum_io_size - the smallest request the device can perform
     91  1.1.1.3  haad 	 *   w/o incurring a read-modify-write penalty (e.g. MD's chunk size)
     92  1.1.1.3  haad 	 * - optimal_io_size - the device's preferred unit of receiving I/O
     93  1.1.1.3  haad 	 *   (e.g. MD's stripe width)
     94  1.1.1.3  haad 	 */
     95  1.1.1.3  haad 	if (find_config_tree_bool(pv->fmt->cmd,
     96  1.1.1.3  haad 				  "devices/data_alignment_detection",
     97  1.1.1.3  haad 				  DEFAULT_DATA_ALIGNMENT_DETECTION)) {
     98  1.1.1.3  haad 		pv->pe_align = MAX(pv->pe_align,
     99  1.1.1.3  haad 				   dev_minimum_io_size(pv->fmt->cmd->sysfs_dir,
    100  1.1.1.3  haad 						       pv->dev));
    101  1.1.1.3  haad 
    102  1.1.1.3  haad 		pv->pe_align = MAX(pv->pe_align,
    103  1.1.1.3  haad 				   dev_optimal_io_size(pv->fmt->cmd->sysfs_dir,
    104  1.1.1.3  haad 						       pv->dev));
    105  1.1.1.3  haad 	}
    106      1.1  haad 
    107      1.1  haad 	log_very_verbose("%s: Setting PE alignment to %lu sectors.",
    108      1.1  haad 			 dev_name(pv->dev), pv->pe_align);
    109      1.1  haad 
    110      1.1  haad out:
    111      1.1  haad 	return pv->pe_align;
    112      1.1  haad }
    113      1.1  haad 
    114  1.1.1.3  haad unsigned long set_pe_align_offset(struct physical_volume *pv,
    115  1.1.1.3  haad 				  unsigned long data_alignment_offset)
    116  1.1.1.3  haad {
    117  1.1.1.3  haad 	if (pv->pe_align_offset)
    118  1.1.1.3  haad 		goto out;
    119  1.1.1.3  haad 
    120  1.1.1.3  haad 	if (data_alignment_offset)
    121  1.1.1.3  haad 		pv->pe_align_offset = data_alignment_offset;
    122  1.1.1.3  haad 
    123  1.1.1.3  haad 	if (!pv->dev)
    124  1.1.1.3  haad 		goto out;
    125  1.1.1.3  haad 
    126  1.1.1.3  haad 	if (find_config_tree_bool(pv->fmt->cmd,
    127  1.1.1.3  haad 				  "devices/data_alignment_offset_detection",
    128  1.1.1.3  haad 				  DEFAULT_DATA_ALIGNMENT_OFFSET_DETECTION))
    129  1.1.1.3  haad 		pv->pe_align_offset =
    130  1.1.1.3  haad 			MAX(pv->pe_align_offset,
    131  1.1.1.3  haad 			    dev_alignment_offset(pv->fmt->cmd->sysfs_dir,
    132  1.1.1.3  haad 						 pv->dev));
    133  1.1.1.3  haad 
    134  1.1.1.3  haad 	log_very_verbose("%s: Setting PE alignment offset to %lu sectors.",
    135  1.1.1.3  haad 			 dev_name(pv->dev), pv->pe_align_offset);
    136  1.1.1.3  haad 
    137  1.1.1.3  haad out:
    138  1.1.1.3  haad 	return pv->pe_align_offset;
    139  1.1.1.3  haad }
    140  1.1.1.3  haad 
    141      1.1  haad /**
    142      1.1  haad  * add_pv_to_vg - Add a physical volume to a volume group
    143      1.1  haad  * @vg - volume group to add to
    144      1.1  haad  * @pv_name - name of the pv (to be removed)
    145      1.1  haad  * @pv - physical volume to add to volume group
    146      1.1  haad  *
    147      1.1  haad  * Returns:
    148      1.1  haad  *  0 - failure
    149      1.1  haad  *  1 - success
    150      1.1  haad  * FIXME: remove pv_name - obtain safely from pv
    151      1.1  haad  */
    152      1.1  haad int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
    153      1.1  haad 		 struct physical_volume *pv)
    154      1.1  haad {
    155      1.1  haad 	struct pv_list *pvl;
    156      1.1  haad 	struct format_instance *fid = vg->fid;
    157  1.1.1.3  haad 	struct dm_pool *mem = vg->vgmem;
    158      1.1  haad 
    159      1.1  haad 	log_verbose("Adding physical volume '%s' to volume group '%s'",
    160      1.1  haad 		    pv_name, vg->name);
    161      1.1  haad 
    162      1.1  haad 	if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) {
    163      1.1  haad 		log_error("pv_list allocation for '%s' failed", pv_name);
    164      1.1  haad 		return 0;
    165      1.1  haad 	}
    166      1.1  haad 
    167      1.1  haad 	if (!is_orphan_vg(pv->vg_name)) {
    168      1.1  haad 		log_error("Physical volume '%s' is already in volume group "
    169      1.1  haad 			  "'%s'", pv_name, pv->vg_name);
    170      1.1  haad 		return 0;
    171      1.1  haad 	}
    172      1.1  haad 
    173      1.1  haad 	if (pv->fmt != fid->fmt) {
    174      1.1  haad 		log_error("Physical volume %s is of different format type (%s)",
    175      1.1  haad 			  pv_name, pv->fmt->name);
    176      1.1  haad 		return 0;
    177      1.1  haad 	}
    178      1.1  haad 
    179      1.1  haad 	/* Ensure PV doesn't depend on another PV already in the VG */
    180      1.1  haad 	if (pv_uses_vg(pv, vg)) {
    181      1.1  haad 		log_error("Physical volume %s might be constructed from same "
    182      1.1  haad 			  "volume group %s", pv_name, vg->name);
    183      1.1  haad 		return 0;
    184      1.1  haad 	}
    185      1.1  haad 
    186      1.1  haad 	if (!(pv->vg_name = dm_pool_strdup(mem, vg->name))) {
    187      1.1  haad 		log_error("vg->name allocation failed for '%s'", pv_name);
    188      1.1  haad 		return 0;
    189      1.1  haad 	}
    190      1.1  haad 
    191      1.1  haad 	memcpy(&pv->vgid, &vg->id, sizeof(vg->id));
    192      1.1  haad 
    193      1.1  haad 	/* Units of 512-byte sectors */
    194      1.1  haad 	pv->pe_size = vg->extent_size;
    195      1.1  haad 
    196      1.1  haad 	/*
    197      1.1  haad 	 * pe_count must always be calculated by pv_setup
    198      1.1  haad 	 */
    199      1.1  haad 	pv->pe_alloc_count = 0;
    200      1.1  haad 
    201      1.1  haad 	if (!fid->fmt->ops->pv_setup(fid->fmt, UINT64_C(0), 0,
    202  1.1.1.3  haad 				     vg->extent_size, 0, 0, 0UL, UINT64_C(0),
    203      1.1  haad 				     &fid->metadata_areas, pv, vg)) {
    204      1.1  haad 		log_error("Format-specific setup of physical volume '%s' "
    205      1.1  haad 			  "failed.", pv_name);
    206      1.1  haad 		return 0;
    207      1.1  haad 	}
    208      1.1  haad 
    209      1.1  haad 	if (_find_pv_in_vg(vg, pv_name)) {
    210      1.1  haad 		log_error("Physical volume '%s' listed more than once.",
    211      1.1  haad 			  pv_name);
    212      1.1  haad 		return 0;
    213      1.1  haad 	}
    214      1.1  haad 
    215      1.1  haad 	if (vg->pv_count && (vg->pv_count == vg->max_pv)) {
    216      1.1  haad 		log_error("No space for '%s' - volume group '%s' "
    217      1.1  haad 			  "holds max %d physical volume(s).", pv_name,
    218      1.1  haad 			  vg->name, vg->max_pv);
    219      1.1  haad 		return 0;
    220      1.1  haad 	}
    221      1.1  haad 
    222      1.1  haad 	if (!alloc_pv_segment_whole_pv(mem, pv))
    223      1.1  haad 		return_0;
    224      1.1  haad 
    225      1.1  haad 	pvl->pv = pv;
    226      1.1  haad 	dm_list_add(&vg->pvs, &pvl->list);
    227      1.1  haad 
    228      1.1  haad 	if ((uint64_t) vg->extent_count + pv->pe_count > UINT32_MAX) {
    229      1.1  haad 		log_error("Unable to add %s to %s: new extent count (%"
    230      1.1  haad 			  PRIu64 ") exceeds limit (%" PRIu32 ").",
    231      1.1  haad 			  pv_name, vg->name,
    232      1.1  haad 			  (uint64_t) vg->extent_count + pv->pe_count,
    233      1.1  haad 			  UINT32_MAX);
    234      1.1  haad 		return 0;
    235      1.1  haad 	}
    236      1.1  haad 
    237      1.1  haad 	vg->pv_count++;
    238      1.1  haad 	vg->extent_count += pv->pe_count;
    239      1.1  haad 	vg->free_count += pv->pe_count;
    240      1.1  haad 
    241      1.1  haad 	return 1;
    242      1.1  haad }
    243      1.1  haad 
    244  1.1.1.3  haad static int _copy_pv(struct dm_pool *pvmem,
    245  1.1.1.3  haad 		    struct physical_volume *pv_to,
    246      1.1  haad 		    struct physical_volume *pv_from)
    247      1.1  haad {
    248      1.1  haad 	memcpy(pv_to, pv_from, sizeof(*pv_to));
    249      1.1  haad 
    250  1.1.1.3  haad 	if (!(pv_to->vg_name = dm_pool_strdup(pvmem, pv_from->vg_name)))
    251  1.1.1.3  haad 		return_0;
    252      1.1  haad 
    253  1.1.1.3  haad 	if (!str_list_dup(pvmem, &pv_to->tags, &pv_from->tags))
    254  1.1.1.3  haad 		return_0;
    255  1.1.1.3  haad 
    256  1.1.1.3  haad 	if (!peg_dup(pvmem, &pv_to->segments, &pv_from->segments))
    257      1.1  haad 		return_0;
    258      1.1  haad 
    259      1.1  haad 	return 1;
    260      1.1  haad }
    261      1.1  haad 
    262  1.1.1.3  haad static struct pv_list *_copy_pvl(struct dm_pool *pvmem, struct pv_list *pvl_from)
    263  1.1.1.3  haad {
    264  1.1.1.3  haad 	struct pv_list *pvl_to = NULL;
    265  1.1.1.3  haad 
    266  1.1.1.3  haad 	if (!(pvl_to = dm_pool_zalloc(pvmem, sizeof(*pvl_to))))
    267  1.1.1.3  haad 		return_NULL;
    268  1.1.1.3  haad 
    269  1.1.1.3  haad 	if (!(pvl_to->pv = dm_pool_alloc(pvmem, sizeof(*pvl_to->pv))))
    270  1.1.1.3  haad 		goto_bad;
    271  1.1.1.3  haad 
    272  1.1.1.3  haad 	if(!_copy_pv(pvmem, pvl_to->pv, pvl_from->pv))
    273  1.1.1.3  haad 		goto_bad;
    274  1.1.1.3  haad 
    275  1.1.1.3  haad 	return pvl_to;
    276  1.1.1.3  haad bad:
    277  1.1.1.3  haad 	dm_pool_free(pvmem, pvl_to);
    278  1.1.1.3  haad 	return NULL;
    279  1.1.1.3  haad }
    280  1.1.1.3  haad 
    281      1.1  haad int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name,
    282      1.1  haad 			 const char *vgid, const char *pvid,
    283      1.1  haad 			 struct physical_volume *pv)
    284      1.1  haad {
    285      1.1  haad 	struct volume_group *vg;
    286      1.1  haad 	struct pv_list *pvl;
    287  1.1.1.3  haad 	int r = 0, consistent = 0;
    288      1.1  haad 
    289  1.1.1.3  haad 	if (!(vg = vg_read_internal(fmt->cmd, vg_name, vgid, &consistent))) {
    290  1.1.1.3  haad 		log_error("get_pv_from_vg_by_id: vg_read_internal failed to read VG %s",
    291      1.1  haad 			  vg_name);
    292      1.1  haad 		return 0;
    293      1.1  haad 	}
    294      1.1  haad 
    295      1.1  haad 	if (!consistent)
    296      1.1  haad 		log_warn("WARNING: Volume group %s is not consistent",
    297      1.1  haad 			 vg_name);
    298      1.1  haad 
    299      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
    300      1.1  haad 		if (id_equal(&pvl->pv->id, (const struct id *) pvid)) {
    301  1.1.1.3  haad 			if (!_copy_pv(fmt->cmd->mem, pv, pvl->pv)) {
    302  1.1.1.3  haad 				log_error("internal PV duplication failed");
    303  1.1.1.3  haad 				r = 0;
    304  1.1.1.3  haad 				goto out;
    305  1.1.1.3  haad 			}
    306  1.1.1.3  haad 			r = 1;
    307  1.1.1.3  haad 			goto out;
    308      1.1  haad 		}
    309      1.1  haad 	}
    310  1.1.1.3  haad out:
    311  1.1.1.3  haad 	vg_release(vg);
    312  1.1.1.3  haad 	return r;
    313  1.1.1.3  haad }
    314      1.1  haad 
    315  1.1.1.3  haad int move_pv(struct volume_group *vg_from, struct volume_group *vg_to,
    316  1.1.1.3  haad 	    const char *pv_name)
    317  1.1.1.3  haad {
    318  1.1.1.3  haad 	struct physical_volume *pv;
    319  1.1.1.3  haad 	struct pv_list *pvl;
    320  1.1.1.3  haad 
    321  1.1.1.3  haad 	/* FIXME: handle tags */
    322  1.1.1.3  haad 	if (!(pvl = find_pv_in_vg(vg_from, pv_name))) {
    323  1.1.1.3  haad 		log_error("Physical volume %s not in volume group %s",
    324  1.1.1.3  haad 			  pv_name, vg_from->name);
    325  1.1.1.3  haad 		return 0;
    326  1.1.1.3  haad 	}
    327  1.1.1.3  haad 
    328  1.1.1.3  haad 	if (_vg_bad_status_bits(vg_from, RESIZEABLE_VG) ||
    329  1.1.1.3  haad 	    _vg_bad_status_bits(vg_to, RESIZEABLE_VG))
    330  1.1.1.3  haad 		return 0;
    331  1.1.1.3  haad 
    332  1.1.1.3  haad 	dm_list_move(&vg_to->pvs, &pvl->list);
    333  1.1.1.3  haad 
    334  1.1.1.3  haad 	vg_from->pv_count--;
    335  1.1.1.3  haad 	vg_to->pv_count++;
    336  1.1.1.3  haad 
    337  1.1.1.3  haad 	pv = pvl->pv;
    338  1.1.1.3  haad 
    339  1.1.1.3  haad 	vg_from->extent_count -= pv_pe_count(pv);
    340  1.1.1.3  haad 	vg_to->extent_count += pv_pe_count(pv);
    341  1.1.1.3  haad 
    342  1.1.1.3  haad 	vg_from->free_count -= pv_pe_count(pv) - pv_pe_alloc_count(pv);
    343  1.1.1.3  haad 	vg_to->free_count += pv_pe_count(pv) - pv_pe_alloc_count(pv);
    344  1.1.1.3  haad 
    345  1.1.1.3  haad 	return 1;
    346  1.1.1.3  haad }
    347  1.1.1.3  haad 
    348  1.1.1.3  haad int move_pvs_used_by_lv(struct volume_group *vg_from,
    349  1.1.1.3  haad 			struct volume_group *vg_to,
    350  1.1.1.3  haad 			const char *lv_name)
    351  1.1.1.3  haad {
    352  1.1.1.3  haad 	struct lv_segment *lvseg;
    353  1.1.1.3  haad 	unsigned s;
    354  1.1.1.3  haad 	struct lv_list *lvl;
    355  1.1.1.3  haad 	struct logical_volume *lv;
    356  1.1.1.3  haad 
    357  1.1.1.3  haad 	/* FIXME: handle tags */
    358  1.1.1.3  haad 	if (!(lvl = find_lv_in_vg(vg_from, lv_name))) {
    359  1.1.1.3  haad 		log_error("Logical volume %s not in volume group %s",
    360  1.1.1.3  haad 			  lv_name, vg_from->name);
    361  1.1.1.3  haad 		return 0;
    362  1.1.1.3  haad 	}
    363  1.1.1.3  haad 
    364  1.1.1.3  haad 	if (_vg_bad_status_bits(vg_from, RESIZEABLE_VG) ||
    365  1.1.1.3  haad 	    _vg_bad_status_bits(vg_to, RESIZEABLE_VG))
    366  1.1.1.3  haad 		return 0;
    367  1.1.1.3  haad 
    368  1.1.1.3  haad 	dm_list_iterate_items(lvseg, &lvl->lv->segments) {
    369  1.1.1.3  haad 		if (lvseg->log_lv)
    370  1.1.1.3  haad 			if (!move_pvs_used_by_lv(vg_from, vg_to,
    371  1.1.1.3  haad 						     lvseg->log_lv->name))
    372  1.1.1.3  haad 				return_0;
    373  1.1.1.3  haad 		for (s = 0; s < lvseg->area_count; s++) {
    374  1.1.1.3  haad 			if (seg_type(lvseg, s) == AREA_PV) {
    375  1.1.1.3  haad 				if (!move_pv(vg_from, vg_to,
    376  1.1.1.3  haad 					      pv_dev_name(seg_pv(lvseg, s))))
    377  1.1.1.3  haad 					return_0;
    378  1.1.1.3  haad 			} else if (seg_type(lvseg, s) == AREA_LV) {
    379  1.1.1.3  haad 				lv = seg_lv(lvseg, s);
    380  1.1.1.3  haad 				if (!move_pvs_used_by_lv(vg_from, vg_to,
    381  1.1.1.3  haad 							     lv->name))
    382  1.1.1.3  haad 				    return_0;
    383  1.1.1.3  haad 			}
    384  1.1.1.3  haad 		}
    385  1.1.1.3  haad 	}
    386  1.1.1.3  haad 	return 1;
    387      1.1  haad }
    388      1.1  haad 
    389      1.1  haad static int validate_new_vg_name(struct cmd_context *cmd, const char *vg_name)
    390      1.1  haad {
    391      1.1  haad 	char vg_path[PATH_MAX];
    392      1.1  haad 
    393      1.1  haad 	if (!validate_name(vg_name))
    394      1.1  haad 		return_0;
    395      1.1  haad 
    396      1.1  haad 	snprintf(vg_path, PATH_MAX, "%s%s", cmd->dev_dir, vg_name);
    397      1.1  haad 	if (path_exists(vg_path)) {
    398      1.1  haad 		log_error("%s: already exists in filesystem", vg_path);
    399      1.1  haad 		return 0;
    400      1.1  haad 	}
    401      1.1  haad 
    402      1.1  haad 	return 1;
    403      1.1  haad }
    404      1.1  haad 
    405      1.1  haad int validate_vg_rename_params(struct cmd_context *cmd,
    406      1.1  haad 			      const char *vg_name_old,
    407      1.1  haad 			      const char *vg_name_new)
    408      1.1  haad {
    409      1.1  haad 	unsigned length;
    410      1.1  haad 	char *dev_dir;
    411      1.1  haad 
    412      1.1  haad 	dev_dir = cmd->dev_dir;
    413      1.1  haad 	length = strlen(dev_dir);
    414      1.1  haad 
    415      1.1  haad 	/* Check sanity of new name */
    416      1.1  haad 	if (strlen(vg_name_new) > NAME_LEN - length - 2) {
    417      1.1  haad 		log_error("New volume group path exceeds maximum length "
    418      1.1  haad 			  "of %d!", NAME_LEN - length - 2);
    419      1.1  haad 		return 0;
    420      1.1  haad 	}
    421      1.1  haad 
    422      1.1  haad 	if (!validate_new_vg_name(cmd, vg_name_new)) {
    423      1.1  haad 		log_error("New volume group name \"%s\" is invalid",
    424      1.1  haad 			  vg_name_new);
    425      1.1  haad 		return 0;
    426      1.1  haad 	}
    427      1.1  haad 
    428      1.1  haad 	if (!strcmp(vg_name_old, vg_name_new)) {
    429      1.1  haad 		log_error("Old and new volume group names must differ");
    430      1.1  haad 		return 0;
    431      1.1  haad 	}
    432      1.1  haad 
    433      1.1  haad 	return 1;
    434      1.1  haad }
    435      1.1  haad 
    436      1.1  haad int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
    437      1.1  haad 	      const char *new_name)
    438      1.1  haad {
    439  1.1.1.3  haad 	struct dm_pool *mem = vg->vgmem;
    440      1.1  haad 	struct pv_list *pvl;
    441      1.1  haad 
    442      1.1  haad 	if (!(vg->name = dm_pool_strdup(mem, new_name))) {
    443      1.1  haad 		log_error("vg->name allocation failed for '%s'", new_name);
    444      1.1  haad 		return 0;
    445      1.1  haad 	}
    446      1.1  haad 
    447      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
    448      1.1  haad 		if (!(pvl->pv->vg_name = dm_pool_strdup(mem, new_name))) {
    449      1.1  haad 			log_error("pv->vg_name allocation failed for '%s'",
    450      1.1  haad 				  pv_dev_name(pvl->pv));
    451      1.1  haad 			return 0;
    452      1.1  haad 		}
    453      1.1  haad 	}
    454      1.1  haad 
    455      1.1  haad 	return 1;
    456      1.1  haad }
    457      1.1  haad 
    458  1.1.1.3  haad int remove_lvs_in_vg(struct cmd_context *cmd,
    459  1.1.1.3  haad 		     struct volume_group *vg,
    460  1.1.1.3  haad 		     force_t force)
    461      1.1  haad {
    462      1.1  haad 	struct dm_list *lst;
    463      1.1  haad 	struct lv_list *lvl;
    464      1.1  haad 
    465      1.1  haad 	while ((lst = dm_list_first(&vg->lvs))) {
    466      1.1  haad 		lvl = dm_list_item(lst, struct lv_list);
    467      1.1  haad 		if (!lv_remove_with_dependencies(cmd, lvl->lv, force))
    468      1.1  haad 		    return 0;
    469      1.1  haad 	}
    470      1.1  haad 
    471      1.1  haad 	return 1;
    472      1.1  haad }
    473      1.1  haad 
    474  1.1.1.3  haad int vg_remove_check(struct volume_group *vg)
    475      1.1  haad {
    476  1.1.1.2  haad 	unsigned lv_count;
    477  1.1.1.3  haad 	struct pv_list *pvl, *tpvl;
    478      1.1  haad 
    479  1.1.1.3  haad 	if (vg_read_error(vg) || vg_missing_pv_count(vg)) {
    480      1.1  haad 		log_error("Volume group \"%s\" not found, is inconsistent "
    481  1.1.1.3  haad 			  "or has PVs missing.", vg ? vg->name : "");
    482      1.1  haad 		log_error("Consider vgreduce --removemissing if metadata "
    483      1.1  haad 			  "is inconsistent.");
    484      1.1  haad 		return 0;
    485      1.1  haad 	}
    486      1.1  haad 
    487      1.1  haad 	if (!vg_check_status(vg, EXPORTED_VG))
    488      1.1  haad 		return 0;
    489      1.1  haad 
    490  1.1.1.3  haad 	lv_count = vg_visible_lvs(vg);
    491  1.1.1.2  haad 
    492  1.1.1.2  haad 	if (lv_count) {
    493  1.1.1.2  haad 		log_error("Volume group \"%s\" still contains %u "
    494  1.1.1.3  haad 			  "logical volume(s)", vg->name, lv_count);
    495      1.1  haad 		return 0;
    496      1.1  haad 	}
    497      1.1  haad 
    498      1.1  haad 	if (!archive(vg))
    499      1.1  haad 		return 0;
    500      1.1  haad 
    501  1.1.1.3  haad 	dm_list_iterate_items_safe(pvl, tpvl, &vg->pvs) {
    502  1.1.1.3  haad 		dm_list_del(&pvl->list);
    503  1.1.1.3  haad 		dm_list_add(&vg->removed_pvs, &pvl->list);
    504  1.1.1.3  haad 	}
    505  1.1.1.3  haad 	return 1;
    506  1.1.1.3  haad }
    507  1.1.1.3  haad 
    508  1.1.1.3  haad int vg_remove(struct volume_group *vg)
    509  1.1.1.3  haad {
    510  1.1.1.3  haad 	struct physical_volume *pv;
    511  1.1.1.3  haad 	struct pv_list *pvl;
    512  1.1.1.3  haad 	int ret = 1;
    513  1.1.1.3  haad 
    514  1.1.1.3  haad 	if (!lock_vol(vg->cmd, VG_ORPHANS, LCK_VG_WRITE)) {
    515  1.1.1.3  haad 		log_error("Can't get lock for orphan PVs");
    516  1.1.1.3  haad 		return 0;
    517  1.1.1.3  haad 	}
    518  1.1.1.3  haad 
    519  1.1.1.3  haad 	if (!vg_remove_mdas(vg)) {
    520  1.1.1.3  haad 		log_error("vg_remove_mdas %s failed", vg->name);
    521  1.1.1.3  haad 		unlock_vg(vg->cmd, VG_ORPHANS);
    522      1.1  haad 		return 0;
    523      1.1  haad 	}
    524      1.1  haad 
    525      1.1  haad 	/* init physical volumes */
    526  1.1.1.3  haad 	dm_list_iterate_items(pvl, &vg->removed_pvs) {
    527      1.1  haad 		pv = pvl->pv;
    528      1.1  haad 		log_verbose("Removing physical volume \"%s\" from "
    529  1.1.1.3  haad 			    "volume group \"%s\"", pv_dev_name(pv), vg->name);
    530      1.1  haad 		pv->vg_name = vg->fid->fmt->orphan_vg_name;
    531      1.1  haad 		pv->status = ALLOCATABLE_PV;
    532      1.1  haad 
    533      1.1  haad 		if (!dev_get_size(pv_dev(pv), &pv->size)) {
    534      1.1  haad 			log_error("%s: Couldn't get size.", pv_dev_name(pv));
    535      1.1  haad 			ret = 0;
    536      1.1  haad 			continue;
    537      1.1  haad 		}
    538      1.1  haad 
    539      1.1  haad 		/* FIXME Write to same sector label was read from */
    540  1.1.1.3  haad 		if (!pv_write(vg->cmd, pv, NULL, INT64_C(-1))) {
    541      1.1  haad 			log_error("Failed to remove physical volume \"%s\""
    542      1.1  haad 				  " from volume group \"%s\"",
    543  1.1.1.3  haad 				  pv_dev_name(pv), vg->name);
    544      1.1  haad 			ret = 0;
    545      1.1  haad 		}
    546      1.1  haad 	}
    547      1.1  haad 
    548  1.1.1.3  haad 	backup_remove(vg->cmd, vg->name);
    549      1.1  haad 
    550      1.1  haad 	if (ret)
    551  1.1.1.3  haad 		log_print("Volume group \"%s\" successfully removed", vg->name);
    552      1.1  haad 	else
    553  1.1.1.3  haad 		log_error("Volume group \"%s\" not properly removed", vg->name);
    554      1.1  haad 
    555  1.1.1.3  haad 	unlock_vg(vg->cmd, VG_ORPHANS);
    556      1.1  haad 	return ret;
    557      1.1  haad }
    558      1.1  haad 
    559  1.1.1.3  haad /*
    560  1.1.1.3  haad  * Extend a VG by a single PV / device path
    561  1.1.1.3  haad  *
    562  1.1.1.3  haad  * Parameters:
    563  1.1.1.3  haad  * - vg: handle of volume group to extend by 'pv_name'
    564  1.1.1.3  haad  * - pv_name: device path of PV to add to VG
    565  1.1.1.3  haad  * - pp: parameters to pass to implicit pvcreate; if NULL, do not pvcreate
    566  1.1.1.3  haad  *
    567  1.1.1.3  haad  */
    568  1.1.1.3  haad static int vg_extend_single_pv(struct volume_group *vg, char *pv_name,
    569  1.1.1.3  haad 			       struct pvcreate_params *pp)
    570      1.1  haad {
    571      1.1  haad 	struct physical_volume *pv;
    572      1.1  haad 
    573  1.1.1.3  haad 	pv = pv_by_path(vg->fid->fmt->cmd, pv_name);
    574  1.1.1.3  haad 	if (!pv && !pp) {
    575  1.1.1.3  haad 		log_error("%s not identified as an existing "
    576  1.1.1.3  haad 			  "physical volume", pv_name);
    577  1.1.1.3  haad 		return 0;
    578  1.1.1.3  haad 	} else if (!pv && pp) {
    579  1.1.1.3  haad 		pv = pvcreate_single(vg->cmd, pv_name, pp);
    580  1.1.1.3  haad 		if (!pv)
    581  1.1.1.3  haad 			return 0;
    582  1.1.1.3  haad 	}
    583  1.1.1.3  haad 	if (!add_pv_to_vg(vg, pv_name, pv))
    584  1.1.1.3  haad 		return 0;
    585  1.1.1.3  haad 	return 1;
    586  1.1.1.3  haad }
    587  1.1.1.3  haad 
    588  1.1.1.3  haad /*
    589  1.1.1.3  haad  * Extend a VG by a single PV / device path
    590  1.1.1.3  haad  *
    591  1.1.1.3  haad  * Parameters:
    592  1.1.1.3  haad  * - vg: handle of volume group to extend by 'pv_name'
    593  1.1.1.3  haad  * - pv_count: count of device paths of PVs
    594  1.1.1.3  haad  * - pv_names: device paths of PVs to add to VG
    595  1.1.1.3  haad  * - pp: parameters to pass to implicit pvcreate; if NULL, do not pvcreate
    596  1.1.1.3  haad  *
    597  1.1.1.3  haad  */
    598  1.1.1.3  haad int vg_extend(struct volume_group *vg, int pv_count, char **pv_names,
    599  1.1.1.3  haad 	      struct pvcreate_params *pp)
    600  1.1.1.3  haad {
    601  1.1.1.3  haad 	int i;
    602  1.1.1.3  haad 
    603  1.1.1.3  haad 	if (_vg_bad_status_bits(vg, RESIZEABLE_VG))
    604  1.1.1.3  haad 		return 0;
    605  1.1.1.3  haad 
    606      1.1  haad 	/* attach each pv */
    607      1.1  haad 	for (i = 0; i < pv_count; i++) {
    608  1.1.1.3  haad 		if (!vg_extend_single_pv(vg, pv_names[i], pp))
    609      1.1  haad 			goto bad;
    610      1.1  haad 	}
    611      1.1  haad 
    612      1.1  haad /* FIXME Decide whether to initialise and add new mdahs to format instance */
    613      1.1  haad 
    614      1.1  haad 	return 1;
    615  1.1.1.3  haad 
    616      1.1  haad       bad:
    617      1.1  haad 	log_error("Unable to add physical volume '%s' to "
    618      1.1  haad 		  "volume group '%s'.", pv_names[i], vg->name);
    619      1.1  haad 	return 0;
    620      1.1  haad }
    621      1.1  haad 
    622  1.1.1.3  haad /* FIXME: use this inside vgreduce_single? */
    623  1.1.1.3  haad int vg_reduce(struct volume_group *vg, char *pv_name)
    624  1.1.1.3  haad {
    625  1.1.1.3  haad 	struct physical_volume *pv;
    626  1.1.1.3  haad 	struct pv_list *pvl;
    627  1.1.1.3  haad 
    628  1.1.1.3  haad 	if (_vg_bad_status_bits(vg, RESIZEABLE_VG))
    629  1.1.1.3  haad 		return 0;
    630  1.1.1.3  haad 
    631  1.1.1.3  haad 	if (!archive(vg))
    632  1.1.1.3  haad 		goto bad;
    633  1.1.1.3  haad 
    634  1.1.1.3  haad 	/* remove each pv */
    635  1.1.1.3  haad 	if (!(pvl = find_pv_in_vg(vg, pv_name))) {
    636  1.1.1.3  haad 		log_error("Physical volume %s not in volume group %s.",
    637  1.1.1.3  haad 			  pv_name, vg->name);
    638  1.1.1.3  haad 		goto bad;
    639  1.1.1.3  haad 	}
    640  1.1.1.3  haad 
    641  1.1.1.3  haad 	pv = pvl->pv;
    642  1.1.1.3  haad 
    643  1.1.1.3  haad 	if (pv_pe_alloc_count(pv)) {
    644  1.1.1.3  haad 		log_error("Physical volume %s still in use.",
    645  1.1.1.3  haad 			  pv_name);
    646  1.1.1.3  haad 		goto bad;
    647  1.1.1.3  haad 	}
    648  1.1.1.3  haad 
    649  1.1.1.3  haad 	if (!dev_get_size(pv_dev(pv), &pv->size)) {
    650  1.1.1.3  haad 		log_error("%s: Couldn't get size.", pv_name);
    651  1.1.1.3  haad 		goto bad;
    652  1.1.1.3  haad 	}
    653  1.1.1.3  haad 
    654  1.1.1.3  haad 	vg->pv_count--;
    655  1.1.1.3  haad 	vg->free_count -= pv_pe_count(pv) - pv_pe_alloc_count(pv);
    656  1.1.1.3  haad 	vg->extent_count -= pv_pe_count(pv);
    657  1.1.1.3  haad 
    658  1.1.1.3  haad 	/* add pv to the remove_pvs list */
    659  1.1.1.3  haad 	dm_list_del(&pvl->list);
    660  1.1.1.3  haad 	dm_list_add(&vg->removed_pvs, &pvl->list);
    661  1.1.1.3  haad 
    662  1.1.1.3  haad 	return 1;
    663  1.1.1.3  haad 
    664  1.1.1.3  haad       bad:
    665  1.1.1.3  haad 	log_error("Unable to remove physical volume '%s' from "
    666  1.1.1.3  haad 		  "volume group '%s'.", pv_name, vg->name);
    667  1.1.1.3  haad 	return 0;
    668  1.1.1.3  haad }
    669  1.1.1.3  haad 
    670      1.1  haad const char *strip_dir(const char *vg_name, const char *dev_dir)
    671      1.1  haad {
    672      1.1  haad 	size_t len = strlen(dev_dir);
    673      1.1  haad 	if (!strncmp(vg_name, dev_dir, len))
    674      1.1  haad 		vg_name += len;
    675      1.1  haad 
    676      1.1  haad 	return vg_name;
    677      1.1  haad }
    678      1.1  haad 
    679      1.1  haad /*
    680      1.1  haad  * Validate parameters to vg_create() before calling.
    681      1.1  haad  * FIXME: Move inside vg_create library function.
    682      1.1  haad  * FIXME: Change vgcreate_params struct to individual gets/sets
    683      1.1  haad  */
    684  1.1.1.3  haad int vgcreate_params_validate(struct cmd_context *cmd,
    685  1.1.1.3  haad 			     struct vgcreate_params *vp)
    686      1.1  haad {
    687      1.1  haad 	if (!validate_new_vg_name(cmd, vp->vg_name)) {
    688      1.1  haad 		log_error("New volume group name \"%s\" is invalid",
    689      1.1  haad 			  vp->vg_name);
    690      1.1  haad 		return 1;
    691      1.1  haad 	}
    692      1.1  haad 
    693      1.1  haad 	if (vp->alloc == ALLOC_INHERIT) {
    694      1.1  haad 		log_error("Volume Group allocation policy cannot inherit "
    695      1.1  haad 			  "from anything");
    696      1.1  haad 		return 1;
    697      1.1  haad 	}
    698      1.1  haad 
    699      1.1  haad 	if (!vp->extent_size) {
    700      1.1  haad 		log_error("Physical extent size may not be zero");
    701      1.1  haad 		return 1;
    702      1.1  haad 	}
    703      1.1  haad 
    704      1.1  haad 	if (!(cmd->fmt->features & FMT_UNLIMITED_VOLS)) {
    705      1.1  haad 		if (!vp->max_lv)
    706      1.1  haad 			vp->max_lv = 255;
    707      1.1  haad 		if (!vp->max_pv)
    708      1.1  haad 			vp->max_pv = 255;
    709      1.1  haad 		if (vp->max_lv > 255 || vp->max_pv > 255) {
    710      1.1  haad 			log_error("Number of volumes may not exceed 255");
    711      1.1  haad 			return 1;
    712      1.1  haad 		}
    713      1.1  haad 	}
    714      1.1  haad 
    715      1.1  haad 	return 0;
    716      1.1  haad }
    717      1.1  haad 
    718  1.1.1.3  haad /*
    719  1.1.1.3  haad  * Create a (struct volume_group) volume group handle from a struct volume_group pointer and a
    720  1.1.1.3  haad  * possible failure code or zero for success.
    721  1.1.1.3  haad  */
    722  1.1.1.3  haad static struct volume_group *_vg_make_handle(struct cmd_context *cmd,
    723  1.1.1.3  haad 			     struct volume_group *vg,
    724  1.1.1.3  haad 			     uint32_t failure)
    725  1.1.1.3  haad {
    726  1.1.1.3  haad 	struct dm_pool *vgmem;
    727  1.1.1.3  haad 
    728  1.1.1.3  haad 	if (!vg) {
    729  1.1.1.3  haad 		if (!(vgmem = dm_pool_create("lvm2 vg_handle", VG_MEMPOOL_CHUNK)) ||
    730  1.1.1.3  haad 		    !(vg = dm_pool_zalloc(vgmem, sizeof(*vg)))) {
    731  1.1.1.3  haad 			log_error("Error allocating vg handle.");
    732  1.1.1.3  haad 			if (vgmem)
    733  1.1.1.3  haad 				dm_pool_destroy(vgmem);
    734  1.1.1.3  haad 			return_NULL;
    735  1.1.1.3  haad 		}
    736  1.1.1.3  haad 		vg->vgmem = vgmem;
    737  1.1.1.3  haad 	}
    738  1.1.1.3  haad 
    739  1.1.1.3  haad 	vg->read_status = failure;
    740  1.1.1.3  haad 
    741  1.1.1.3  haad 	return (struct volume_group *)vg;
    742  1.1.1.3  haad }
    743  1.1.1.3  haad 
    744  1.1.1.3  haad int lv_has_unknown_segments(const struct logical_volume *lv)
    745  1.1.1.3  haad {
    746  1.1.1.3  haad 	struct lv_segment *seg;
    747  1.1.1.3  haad 	/* foreach segment */
    748  1.1.1.3  haad 	dm_list_iterate_items(seg, &lv->segments)
    749  1.1.1.3  haad 		if (seg_unknown(seg))
    750  1.1.1.3  haad 			return 1;
    751  1.1.1.3  haad 	return 0;
    752  1.1.1.3  haad }
    753  1.1.1.3  haad 
    754  1.1.1.3  haad int vg_has_unknown_segments(const struct volume_group *vg)
    755  1.1.1.3  haad {
    756  1.1.1.3  haad 	struct lv_list *lvl;
    757  1.1.1.3  haad 
    758  1.1.1.3  haad 	/* foreach LV */
    759  1.1.1.3  haad 	dm_list_iterate_items(lvl, &vg->lvs)
    760  1.1.1.3  haad 		if (lv_has_unknown_segments(lvl->lv))
    761  1.1.1.3  haad 			return 1;
    762  1.1.1.3  haad 	return 0;
    763  1.1.1.3  haad }
    764  1.1.1.3  haad 
    765  1.1.1.3  haad /*
    766  1.1.1.3  haad  * Create a VG with default parameters.
    767  1.1.1.3  haad  * Returns:
    768  1.1.1.3  haad  * - struct volume_group* with SUCCESS code: VG structure created
    769  1.1.1.3  haad  * - NULL or struct volume_group* with FAILED_* code: error creating VG structure
    770  1.1.1.3  haad  * Use vg_read_error() to determine success or failure.
    771  1.1.1.3  haad  * FIXME: cleanup usage of _vg_make_handle()
    772  1.1.1.3  haad  */
    773  1.1.1.3  haad struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name)
    774      1.1  haad {
    775      1.1  haad 	struct volume_group *vg;
    776      1.1  haad 	int consistent = 0;
    777  1.1.1.3  haad 	struct dm_pool *mem;
    778  1.1.1.3  haad 	uint32_t rc;
    779      1.1  haad 
    780  1.1.1.3  haad 	if (!validate_name(vg_name)) {
    781  1.1.1.3  haad 		log_error("Invalid vg name %s", vg_name);
    782  1.1.1.3  haad 		/* FIXME: use _vg_make_handle() w/proper error code */
    783  1.1.1.3  haad 		return NULL;
    784  1.1.1.3  haad 	}
    785      1.1  haad 
    786  1.1.1.3  haad 	rc = vg_lock_newname(cmd, vg_name);
    787  1.1.1.3  haad 	if (rc != SUCCESS)
    788  1.1.1.3  haad 		/* NOTE: let caller decide - this may be check for existence */
    789  1.1.1.3  haad 		return _vg_make_handle(cmd, NULL, rc);
    790  1.1.1.3  haad 
    791  1.1.1.3  haad 	/* FIXME: Is this vg_read_internal necessary? Move it inside
    792  1.1.1.3  haad 	   vg_lock_newname? */
    793      1.1  haad 	/* is this vg name already in use ? */
    794  1.1.1.3  haad 	if ((vg = vg_read_internal(cmd, vg_name, NULL, &consistent))) {
    795  1.1.1.3  haad 		log_error("A volume group called '%s' already exists.", vg_name);
    796  1.1.1.3  haad 		unlock_and_release_vg(cmd, vg, vg_name);
    797  1.1.1.3  haad 		return _vg_make_handle(cmd, NULL, FAILED_EXIST);
    798      1.1  haad 	}
    799      1.1  haad 
    800  1.1.1.3  haad 	if (!(mem = dm_pool_create("lvm2 vg_create", VG_MEMPOOL_CHUNK)))
    801  1.1.1.3  haad 		goto_bad;
    802  1.1.1.3  haad 
    803  1.1.1.3  haad 	if (!(vg = dm_pool_zalloc(mem, sizeof(*vg))))
    804  1.1.1.3  haad 		goto_bad;
    805  1.1.1.3  haad 
    806      1.1  haad 	if (!id_create(&vg->id)) {
    807  1.1.1.3  haad 		log_error("Couldn't create uuid for volume group '%s'.",
    808  1.1.1.3  haad 			  vg_name);
    809      1.1  haad 		goto bad;
    810      1.1  haad 	}
    811      1.1  haad 
    812      1.1  haad 	/* Strip dev_dir if present */
    813      1.1  haad 	vg_name = strip_dir(vg_name, cmd->dev_dir);
    814      1.1  haad 
    815  1.1.1.3  haad 	vg->vgmem = mem;
    816      1.1  haad 	vg->cmd = cmd;
    817      1.1  haad 
    818      1.1  haad 	if (!(vg->name = dm_pool_strdup(mem, vg_name)))
    819      1.1  haad 		goto_bad;
    820      1.1  haad 
    821      1.1  haad 	vg->seqno = 0;
    822      1.1  haad 
    823      1.1  haad 	vg->status = (RESIZEABLE_VG | LVM_READ | LVM_WRITE);
    824      1.1  haad 	if (!(vg->system_id = dm_pool_alloc(mem, NAME_LEN)))
    825      1.1  haad 		goto_bad;
    826      1.1  haad 
    827      1.1  haad 	*vg->system_id = '\0';
    828      1.1  haad 
    829  1.1.1.3  haad 	vg->extent_size = DEFAULT_EXTENT_SIZE * 2;
    830      1.1  haad 	vg->extent_count = 0;
    831      1.1  haad 	vg->free_count = 0;
    832      1.1  haad 
    833  1.1.1.3  haad 	vg->max_lv = DEFAULT_MAX_LV;
    834  1.1.1.3  haad 	vg->max_pv = DEFAULT_MAX_PV;
    835      1.1  haad 
    836  1.1.1.3  haad 	vg->alloc = DEFAULT_ALLOC_POLICY;
    837      1.1  haad 
    838      1.1  haad 	vg->pv_count = 0;
    839      1.1  haad 	dm_list_init(&vg->pvs);
    840      1.1  haad 
    841      1.1  haad 	dm_list_init(&vg->lvs);
    842      1.1  haad 
    843      1.1  haad 	dm_list_init(&vg->tags);
    844      1.1  haad 
    845  1.1.1.3  haad 	/* initialize removed_pvs list */
    846  1.1.1.3  haad 	dm_list_init(&vg->removed_pvs);
    847  1.1.1.3  haad 
    848      1.1  haad 	if (!(vg->fid = cmd->fmt->ops->create_instance(cmd->fmt, vg_name,
    849      1.1  haad 						       NULL, NULL))) {
    850      1.1  haad 		log_error("Failed to create format instance");
    851      1.1  haad 		goto bad;
    852      1.1  haad 	}
    853      1.1  haad 
    854      1.1  haad 	if (vg->fid->fmt->ops->vg_setup &&
    855      1.1  haad 	    !vg->fid->fmt->ops->vg_setup(vg->fid, vg)) {
    856      1.1  haad 		log_error("Format specific setup of volume group '%s' failed.",
    857      1.1  haad 			  vg_name);
    858      1.1  haad 		goto bad;
    859      1.1  haad 	}
    860  1.1.1.3  haad 	return _vg_make_handle(cmd, vg, SUCCESS);
    861      1.1  haad 
    862  1.1.1.3  haad bad:
    863  1.1.1.3  haad 	unlock_and_release_vg(cmd, vg, vg_name);
    864  1.1.1.3  haad 	/* FIXME: use _vg_make_handle() w/proper error code */
    865  1.1.1.3  haad 	return NULL;
    866  1.1.1.3  haad }
    867      1.1  haad 
    868  1.1.1.3  haad uint64_t extents_from_size(struct cmd_context *cmd, uint64_t size,
    869  1.1.1.3  haad 			   uint32_t extent_size)
    870  1.1.1.3  haad {
    871  1.1.1.3  haad 	if (size % extent_size) {
    872  1.1.1.3  haad 		size += extent_size - size % extent_size;
    873  1.1.1.3  haad 		log_print("Rounding up size to full physical extent %s",
    874  1.1.1.3  haad 			  display_size(cmd, size));
    875  1.1.1.3  haad 	}
    876      1.1  haad 
    877  1.1.1.3  haad 	if (size > (uint64_t) UINT32_MAX * extent_size) {
    878  1.1.1.3  haad 		log_error("Volume too large (%s) for extent size %s. "
    879  1.1.1.3  haad 			  "Upper limit is %s.",
    880  1.1.1.3  haad 			  display_size(cmd, size),
    881  1.1.1.3  haad 			  display_size(cmd, (uint64_t) extent_size),
    882  1.1.1.3  haad 			  display_size(cmd, (uint64_t) UINT32_MAX *
    883  1.1.1.3  haad 				       extent_size));
    884  1.1.1.3  haad 		return 0;
    885  1.1.1.3  haad 	}
    886  1.1.1.3  haad 
    887  1.1.1.3  haad 	return (uint64_t) size / extent_size;
    888      1.1  haad }
    889      1.1  haad 
    890      1.1  haad static int _recalc_extents(uint32_t *extents, const char *desc1,
    891      1.1  haad 			   const char *desc2, uint32_t old_size,
    892      1.1  haad 			   uint32_t new_size)
    893      1.1  haad {
    894      1.1  haad 	uint64_t size = (uint64_t) old_size * (*extents);
    895      1.1  haad 
    896      1.1  haad 	if (size % new_size) {
    897      1.1  haad 		log_error("New size %" PRIu64 " for %s%s not an exact number "
    898      1.1  haad 			  "of new extents.", size, desc1, desc2);
    899      1.1  haad 		return 0;
    900      1.1  haad 	}
    901      1.1  haad 
    902      1.1  haad 	size /= new_size;
    903      1.1  haad 
    904      1.1  haad 	if (size > UINT32_MAX) {
    905      1.1  haad 		log_error("New extent count %" PRIu64 " for %s%s exceeds "
    906      1.1  haad 			  "32 bits.", size, desc1, desc2);
    907      1.1  haad 		return 0;
    908      1.1  haad 	}
    909      1.1  haad 
    910      1.1  haad 	*extents = (uint32_t) size;
    911      1.1  haad 
    912      1.1  haad 	return 1;
    913      1.1  haad }
    914      1.1  haad 
    915  1.1.1.3  haad int vg_set_extent_size(struct volume_group *vg, uint32_t new_size)
    916      1.1  haad {
    917      1.1  haad 	uint32_t old_size = vg->extent_size;
    918      1.1  haad 	struct pv_list *pvl;
    919      1.1  haad 	struct lv_list *lvl;
    920      1.1  haad 	struct physical_volume *pv;
    921      1.1  haad 	struct logical_volume *lv;
    922      1.1  haad 	struct lv_segment *seg;
    923      1.1  haad 	struct pv_segment *pvseg;
    924      1.1  haad 	uint32_t s;
    925      1.1  haad 
    926  1.1.1.3  haad 	if (!vg_is_resizeable(vg)) {
    927  1.1.1.3  haad 		log_error("Volume group \"%s\" must be resizeable "
    928  1.1.1.3  haad 			  "to change PE size", vg->name);
    929  1.1.1.3  haad 		return 0;
    930  1.1.1.3  haad 	}
    931  1.1.1.3  haad 
    932  1.1.1.3  haad 	if (!new_size) {
    933  1.1.1.3  haad 		log_error("Physical extent size may not be zero");
    934  1.1.1.3  haad 		return 0;
    935  1.1.1.3  haad 	}
    936  1.1.1.3  haad 
    937  1.1.1.3  haad 	if (new_size == vg->extent_size)
    938  1.1.1.3  haad 		return 1;
    939  1.1.1.3  haad 
    940  1.1.1.3  haad 	if (new_size & (new_size - 1)) {
    941  1.1.1.3  haad 		log_error("Physical extent size must be a power of 2.");
    942  1.1.1.3  haad 		return 0;
    943  1.1.1.3  haad 	}
    944  1.1.1.3  haad 
    945  1.1.1.3  haad 	if (new_size > vg->extent_size) {
    946  1.1.1.3  haad 		if ((uint64_t) vg_size(vg) % new_size) {
    947  1.1.1.3  haad 			/* FIXME Adjust used PV sizes instead */
    948  1.1.1.3  haad 			log_error("New extent size is not a perfect fit");
    949  1.1.1.3  haad 			return 0;
    950  1.1.1.3  haad 		}
    951  1.1.1.3  haad 	}
    952  1.1.1.3  haad 
    953      1.1  haad 	vg->extent_size = new_size;
    954      1.1  haad 
    955      1.1  haad 	if (vg->fid->fmt->ops->vg_setup &&
    956      1.1  haad 	    !vg->fid->fmt->ops->vg_setup(vg->fid, vg))
    957      1.1  haad 		return_0;
    958      1.1  haad 
    959      1.1  haad 	if (!_recalc_extents(&vg->extent_count, vg->name, "", old_size,
    960      1.1  haad 			     new_size))
    961      1.1  haad 		return_0;
    962      1.1  haad 
    963      1.1  haad 	if (!_recalc_extents(&vg->free_count, vg->name, " free space",
    964      1.1  haad 			     old_size, new_size))
    965      1.1  haad 		return_0;
    966      1.1  haad 
    967      1.1  haad 	/* foreach PV */
    968      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
    969      1.1  haad 		pv = pvl->pv;
    970      1.1  haad 
    971      1.1  haad 		pv->pe_size = new_size;
    972      1.1  haad 		if (!_recalc_extents(&pv->pe_count, pv_dev_name(pv), "",
    973      1.1  haad 				     old_size, new_size))
    974      1.1  haad 			return_0;
    975      1.1  haad 
    976      1.1  haad 		if (!_recalc_extents(&pv->pe_alloc_count, pv_dev_name(pv),
    977      1.1  haad 				     " allocated space", old_size, new_size))
    978      1.1  haad 			return_0;
    979      1.1  haad 
    980      1.1  haad 		/* foreach free PV Segment */
    981      1.1  haad 		dm_list_iterate_items(pvseg, &pv->segments) {
    982      1.1  haad 			if (pvseg_is_allocated(pvseg))
    983      1.1  haad 				continue;
    984      1.1  haad 
    985      1.1  haad 			if (!_recalc_extents(&pvseg->pe, pv_dev_name(pv),
    986      1.1  haad 					     " PV segment start", old_size,
    987      1.1  haad 					     new_size))
    988      1.1  haad 				return_0;
    989      1.1  haad 			if (!_recalc_extents(&pvseg->len, pv_dev_name(pv),
    990      1.1  haad 					     " PV segment length", old_size,
    991      1.1  haad 					     new_size))
    992      1.1  haad 				return_0;
    993      1.1  haad 		}
    994      1.1  haad 	}
    995      1.1  haad 
    996      1.1  haad 	/* foreach LV */
    997      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
    998      1.1  haad 		lv = lvl->lv;
    999      1.1  haad 
   1000      1.1  haad 		if (!_recalc_extents(&lv->le_count, lv->name, "", old_size,
   1001      1.1  haad 				     new_size))
   1002      1.1  haad 			return_0;
   1003      1.1  haad 
   1004      1.1  haad 		dm_list_iterate_items(seg, &lv->segments) {
   1005      1.1  haad 			if (!_recalc_extents(&seg->le, lv->name,
   1006      1.1  haad 					     " segment start", old_size,
   1007      1.1  haad 					     new_size))
   1008      1.1  haad 				return_0;
   1009      1.1  haad 
   1010      1.1  haad 			if (!_recalc_extents(&seg->len, lv->name,
   1011      1.1  haad 					     " segment length", old_size,
   1012      1.1  haad 					     new_size))
   1013      1.1  haad 				return_0;
   1014      1.1  haad 
   1015      1.1  haad 			if (!_recalc_extents(&seg->area_len, lv->name,
   1016      1.1  haad 					     " area length", old_size,
   1017      1.1  haad 					     new_size))
   1018      1.1  haad 				return_0;
   1019      1.1  haad 
   1020      1.1  haad 			if (!_recalc_extents(&seg->extents_copied, lv->name,
   1021      1.1  haad 					     " extents moved", old_size,
   1022      1.1  haad 					     new_size))
   1023      1.1  haad 				return_0;
   1024      1.1  haad 
   1025      1.1  haad 			/* foreach area */
   1026      1.1  haad 			for (s = 0; s < seg->area_count; s++) {
   1027      1.1  haad 				switch (seg_type(seg, s)) {
   1028      1.1  haad 				case AREA_PV:
   1029      1.1  haad 					if (!_recalc_extents
   1030      1.1  haad 					    (&seg_pe(seg, s),
   1031      1.1  haad 					     lv->name,
   1032      1.1  haad 					     " pvseg start", old_size,
   1033      1.1  haad 					     new_size))
   1034      1.1  haad 						return_0;
   1035      1.1  haad 					if (!_recalc_extents
   1036      1.1  haad 					    (&seg_pvseg(seg, s)->len,
   1037      1.1  haad 					     lv->name,
   1038      1.1  haad 					     " pvseg length", old_size,
   1039      1.1  haad 					     new_size))
   1040      1.1  haad 						return_0;
   1041      1.1  haad 					break;
   1042      1.1  haad 				case AREA_LV:
   1043      1.1  haad 					if (!_recalc_extents
   1044      1.1  haad 					    (&seg_le(seg, s), lv->name,
   1045      1.1  haad 					     " area start", old_size,
   1046      1.1  haad 					     new_size))
   1047      1.1  haad 						return_0;
   1048      1.1  haad 					break;
   1049      1.1  haad 				case AREA_UNASSIGNED:
   1050      1.1  haad 					log_error("Unassigned area %u found in "
   1051      1.1  haad 						  "segment", s);
   1052      1.1  haad 					return 0;
   1053      1.1  haad 				}
   1054      1.1  haad 			}
   1055      1.1  haad 		}
   1056      1.1  haad 
   1057      1.1  haad 	}
   1058      1.1  haad 
   1059      1.1  haad 	return 1;
   1060      1.1  haad }
   1061      1.1  haad 
   1062  1.1.1.3  haad int vg_set_max_lv(struct volume_group *vg, uint32_t max_lv)
   1063  1.1.1.3  haad {
   1064  1.1.1.3  haad 	if (!vg_is_resizeable(vg)) {
   1065  1.1.1.3  haad 		log_error("Volume group \"%s\" must be resizeable "
   1066  1.1.1.3  haad 			  "to change MaxLogicalVolume", vg->name);
   1067  1.1.1.3  haad 		return 0;
   1068  1.1.1.3  haad 	}
   1069  1.1.1.3  haad 
   1070  1.1.1.3  haad 	if (!(vg->fid->fmt->features & FMT_UNLIMITED_VOLS)) {
   1071  1.1.1.3  haad 		if (!max_lv)
   1072  1.1.1.3  haad 			max_lv = 255;
   1073  1.1.1.3  haad 		else if (max_lv > 255) {
   1074  1.1.1.3  haad 			log_error("MaxLogicalVolume limit is 255");
   1075  1.1.1.3  haad 			return 0;
   1076  1.1.1.3  haad 		}
   1077  1.1.1.3  haad 	}
   1078  1.1.1.3  haad 
   1079  1.1.1.3  haad 	if (max_lv && max_lv < vg_visible_lvs(vg)) {
   1080  1.1.1.3  haad 		log_error("MaxLogicalVolume is less than the current number "
   1081  1.1.1.3  haad 			  "%d of LVs for %s", vg_visible_lvs(vg),
   1082  1.1.1.3  haad 			  vg->name);
   1083  1.1.1.3  haad 		return 0;
   1084  1.1.1.3  haad 	}
   1085  1.1.1.3  haad 	vg->max_lv = max_lv;
   1086  1.1.1.3  haad 
   1087  1.1.1.3  haad 	return 1;
   1088  1.1.1.3  haad }
   1089  1.1.1.3  haad 
   1090  1.1.1.3  haad int vg_set_max_pv(struct volume_group *vg, uint32_t max_pv)
   1091  1.1.1.3  haad {
   1092  1.1.1.3  haad 	if (!vg_is_resizeable(vg)) {
   1093  1.1.1.3  haad 		log_error("Volume group \"%s\" must be resizeable "
   1094  1.1.1.3  haad 			  "to change MaxPhysicalVolumes", vg->name);
   1095  1.1.1.3  haad 		return 0;
   1096  1.1.1.3  haad 	}
   1097  1.1.1.3  haad 
   1098  1.1.1.3  haad 	if (!(vg->fid->fmt->features & FMT_UNLIMITED_VOLS)) {
   1099  1.1.1.3  haad 		if (!max_pv)
   1100  1.1.1.3  haad 			max_pv = 255;
   1101  1.1.1.3  haad 		else if (max_pv > 255) {
   1102  1.1.1.3  haad 			log_error("MaxPhysicalVolume limit is 255");
   1103  1.1.1.3  haad 			return 0;
   1104  1.1.1.3  haad 		}
   1105  1.1.1.3  haad 	}
   1106  1.1.1.3  haad 
   1107  1.1.1.3  haad 	if (max_pv && max_pv < vg->pv_count) {
   1108  1.1.1.3  haad 		log_error("MaxPhysicalVolumes is less than the current number "
   1109  1.1.1.3  haad 			  "%d of PVs for \"%s\"", vg->pv_count,
   1110  1.1.1.3  haad 			  vg->name);
   1111  1.1.1.3  haad 		return 0;
   1112  1.1.1.3  haad 	}
   1113  1.1.1.3  haad 	vg->max_pv = max_pv;
   1114  1.1.1.3  haad 	return 1;
   1115  1.1.1.3  haad }
   1116  1.1.1.3  haad 
   1117  1.1.1.3  haad int vg_set_alloc_policy(struct volume_group *vg, alloc_policy_t alloc)
   1118  1.1.1.3  haad {
   1119  1.1.1.3  haad 	if (alloc == ALLOC_INHERIT) {
   1120  1.1.1.3  haad 		log_error("Volume Group allocation policy cannot inherit "
   1121  1.1.1.3  haad 			  "from anything");
   1122  1.1.1.3  haad 		return 0;
   1123  1.1.1.3  haad 	}
   1124  1.1.1.3  haad 
   1125  1.1.1.3  haad 	if (alloc == vg->alloc)
   1126  1.1.1.3  haad 		return 1;
   1127  1.1.1.3  haad 
   1128  1.1.1.3  haad 	vg->alloc = alloc;
   1129  1.1.1.3  haad 	return 1;
   1130  1.1.1.3  haad }
   1131  1.1.1.3  haad 
   1132  1.1.1.3  haad int vg_set_clustered(struct volume_group *vg, int clustered)
   1133  1.1.1.3  haad {
   1134  1.1.1.3  haad 	struct lv_list *lvl;
   1135  1.1.1.3  haad 	if (clustered) {
   1136  1.1.1.3  haad 		dm_list_iterate_items(lvl, &vg->lvs) {
   1137  1.1.1.3  haad 			if (lv_is_origin(lvl->lv) || lv_is_cow(lvl->lv)) {
   1138  1.1.1.3  haad 				log_error("Volume group %s contains snapshots "
   1139  1.1.1.3  haad 					  "that are not yet supported.",
   1140  1.1.1.3  haad 					  vg->name);
   1141  1.1.1.3  haad 				return 0;
   1142  1.1.1.3  haad 			}
   1143  1.1.1.3  haad 		}
   1144  1.1.1.3  haad 	}
   1145  1.1.1.3  haad 
   1146  1.1.1.3  haad 	if (clustered)
   1147  1.1.1.3  haad 		vg->status |= CLUSTERED;
   1148  1.1.1.3  haad 	else
   1149  1.1.1.3  haad 		vg->status &= ~CLUSTERED;
   1150  1.1.1.3  haad 	return 1;
   1151  1.1.1.3  haad }
   1152  1.1.1.3  haad 
   1153      1.1  haad /*
   1154      1.1  haad  * Separate metadata areas after splitting a VG.
   1155      1.1  haad  * Also accepts orphan VG as destination (for vgreduce).
   1156      1.1  haad  */
   1157      1.1  haad int vg_split_mdas(struct cmd_context *cmd __attribute((unused)),
   1158      1.1  haad 		  struct volume_group *vg_from, struct volume_group *vg_to)
   1159      1.1  haad {
   1160      1.1  haad 	struct metadata_area *mda, *mda2;
   1161      1.1  haad 	struct dm_list *mdas_from, *mdas_to;
   1162      1.1  haad 	int common_mda = 0;
   1163      1.1  haad 
   1164      1.1  haad 	mdas_from = &vg_from->fid->metadata_areas;
   1165      1.1  haad 	mdas_to = &vg_to->fid->metadata_areas;
   1166      1.1  haad 
   1167      1.1  haad 	dm_list_iterate_items_safe(mda, mda2, mdas_from) {
   1168      1.1  haad 		if (!mda->ops->mda_in_vg) {
   1169      1.1  haad 			common_mda = 1;
   1170      1.1  haad 			continue;
   1171      1.1  haad 		}
   1172      1.1  haad 
   1173      1.1  haad 		if (!mda->ops->mda_in_vg(vg_from->fid, vg_from, mda)) {
   1174      1.1  haad 			if (is_orphan_vg(vg_to->name))
   1175      1.1  haad 				dm_list_del(&mda->list);
   1176      1.1  haad 			else
   1177      1.1  haad 				dm_list_move(mdas_to, &mda->list);
   1178      1.1  haad 		}
   1179      1.1  haad 	}
   1180      1.1  haad 
   1181      1.1  haad 	if (dm_list_empty(mdas_from) ||
   1182      1.1  haad 	    (!is_orphan_vg(vg_to->name) && dm_list_empty(mdas_to)))
   1183      1.1  haad 		return common_mda;
   1184      1.1  haad 
   1185      1.1  haad 	return 1;
   1186      1.1  haad }
   1187      1.1  haad 
   1188  1.1.1.3  haad /*
   1189  1.1.1.3  haad  * See if we may pvcreate on this device.
   1190  1.1.1.3  haad  * 0 indicates we may not.
   1191  1.1.1.3  haad  */
   1192  1.1.1.3  haad static int pvcreate_check(struct cmd_context *cmd, const char *name,
   1193  1.1.1.3  haad 			  struct pvcreate_params *pp)
   1194  1.1.1.3  haad {
   1195  1.1.1.3  haad 	struct physical_volume *pv;
   1196  1.1.1.3  haad 	struct device *dev;
   1197  1.1.1.3  haad 	uint64_t md_superblock, swap_signature;
   1198  1.1.1.3  haad 	int wipe_md, wipe_swap;
   1199  1.1.1.3  haad 
   1200  1.1.1.3  haad 	/* FIXME Check partition type is LVM unless --force is given */
   1201  1.1.1.3  haad 
   1202  1.1.1.3  haad 	/* Is there a pv here already? */
   1203  1.1.1.3  haad 	pv = pv_read(cmd, name, NULL, NULL, 0, 0);
   1204  1.1.1.3  haad 
   1205  1.1.1.3  haad 	/*
   1206  1.1.1.3  haad 	 * If a PV has no MDAs it may appear to be an orphan until the
   1207  1.1.1.3  haad 	 * metadata is read off another PV in the same VG.  Detecting
   1208  1.1.1.3  haad 	 * this means checking every VG by scanning every PV on the
   1209  1.1.1.3  haad 	 * system.
   1210  1.1.1.3  haad 	 */
   1211  1.1.1.3  haad 	if (pv && is_orphan(pv)) {
   1212  1.1.1.3  haad 		if (!scan_vgs_for_pvs(cmd))
   1213  1.1.1.3  haad 			return_0;
   1214  1.1.1.3  haad 		pv = pv_read(cmd, name, NULL, NULL, 0, 0);
   1215  1.1.1.3  haad 	}
   1216  1.1.1.3  haad 
   1217  1.1.1.3  haad 	/* Allow partial & exported VGs to be destroyed. */
   1218  1.1.1.3  haad 	/* We must have -ff to overwrite a non orphan */
   1219  1.1.1.3  haad 	if (pv && !is_orphan(pv) && pp->force != DONT_PROMPT_OVERRIDE) {
   1220  1.1.1.3  haad 		log_error("Can't initialize physical volume \"%s\" of "
   1221  1.1.1.3  haad 			  "volume group \"%s\" without -ff", name, pv_vg_name(pv));
   1222  1.1.1.3  haad 		return 0;
   1223  1.1.1.3  haad 	}
   1224  1.1.1.3  haad 
   1225  1.1.1.3  haad 	/* prompt */
   1226  1.1.1.3  haad 	if (pv && !is_orphan(pv) && !pp->yes &&
   1227  1.1.1.3  haad 	    yes_no_prompt(_really_init, name, pv_vg_name(pv)) == 'n') {
   1228  1.1.1.3  haad 		log_print("%s: physical volume not initialized", name);
   1229  1.1.1.3  haad 		return 0;
   1230  1.1.1.3  haad 	}
   1231  1.1.1.3  haad 
   1232  1.1.1.3  haad 	if (sigint_caught())
   1233  1.1.1.3  haad 		return 0;
   1234  1.1.1.3  haad 
   1235  1.1.1.3  haad 	dev = dev_cache_get(name, cmd->filter);
   1236  1.1.1.3  haad 
   1237  1.1.1.3  haad 	/* Is there an md superblock here? */
   1238  1.1.1.3  haad 	if (!dev && md_filtering()) {
   1239  1.1.1.3  haad 		unlock_vg(cmd, VG_ORPHANS);
   1240  1.1.1.3  haad 
   1241  1.1.1.3  haad 		persistent_filter_wipe(cmd->filter);
   1242  1.1.1.3  haad 		lvmcache_destroy(cmd, 1);
   1243  1.1.1.3  haad 
   1244  1.1.1.3  haad 		init_md_filtering(0);
   1245  1.1.1.3  haad 		if (!lock_vol(cmd, VG_ORPHANS, LCK_VG_WRITE)) {
   1246  1.1.1.3  haad 			log_error("Can't get lock for orphan PVs");
   1247  1.1.1.3  haad 			init_md_filtering(1);
   1248  1.1.1.3  haad 			return 0;
   1249  1.1.1.3  haad 		}
   1250  1.1.1.3  haad 		dev = dev_cache_get(name, cmd->filter);
   1251  1.1.1.3  haad 		init_md_filtering(1);
   1252  1.1.1.3  haad 	}
   1253  1.1.1.3  haad 
   1254  1.1.1.3  haad 	if (!dev) {
   1255  1.1.1.3  haad 		log_error("Device %s not found (or ignored by filtering).", name);
   1256  1.1.1.3  haad 		return 0;
   1257  1.1.1.3  haad 	}
   1258  1.1.1.3  haad 
   1259  1.1.1.3  haad 	/*
   1260  1.1.1.3  haad 	 * This test will fail if the device belongs to an MD array.
   1261  1.1.1.3  haad 	 */
   1262  1.1.1.3  haad 	if (!dev_test_excl(dev)) {
   1263  1.1.1.3  haad 		/* FIXME Detect whether device-mapper itself is still using it */
   1264  1.1.1.3  haad 		log_error("Can't open %s exclusively.  Mounted filesystem?",
   1265  1.1.1.3  haad 			  name);
   1266  1.1.1.3  haad 		return 0;
   1267  1.1.1.3  haad 	}
   1268  1.1.1.3  haad 
   1269  1.1.1.3  haad 	/* Wipe superblock? */
   1270  1.1.1.3  haad 	if ((wipe_md = dev_is_md(dev, &md_superblock)) == 1 &&
   1271  1.1.1.3  haad 	    ((!pp->idp && !pp->restorefile) || pp->yes ||
   1272  1.1.1.3  haad 	     (yes_no_prompt("Software RAID md superblock "
   1273  1.1.1.3  haad 			    "detected on %s. Wipe it? [y/n] ", name) == 'y'))) {
   1274  1.1.1.3  haad 		log_print("Wiping software RAID md superblock on %s", name);
   1275  1.1.1.3  haad 		if (!dev_set(dev, md_superblock, 4, 0)) {
   1276  1.1.1.3  haad 			log_error("Failed to wipe RAID md superblock on %s",
   1277  1.1.1.3  haad 				  name);
   1278  1.1.1.3  haad 			return 0;
   1279  1.1.1.3  haad 		}
   1280  1.1.1.3  haad 	}
   1281  1.1.1.3  haad 
   1282  1.1.1.3  haad 	if (wipe_md == -1) {
   1283  1.1.1.3  haad 		log_error("Fatal error while trying to detect software "
   1284  1.1.1.3  haad 			  "RAID md superblock on %s", name);
   1285  1.1.1.3  haad 		return 0;
   1286  1.1.1.3  haad 	}
   1287  1.1.1.3  haad 
   1288  1.1.1.3  haad 	if ((wipe_swap = dev_is_swap(dev, &swap_signature)) == 1 &&
   1289  1.1.1.3  haad 	    ((!pp->idp && !pp->restorefile) || pp->yes ||
   1290  1.1.1.3  haad 	     (yes_no_prompt("Swap signature detected on %s. Wipe it? [y/n] ",
   1291  1.1.1.3  haad 			    name) == 'y'))) {
   1292  1.1.1.3  haad 		log_print("Wiping swap signature on %s", name);
   1293  1.1.1.3  haad 		if (!dev_set(dev, swap_signature, 10, 0)) {
   1294  1.1.1.3  haad 			log_error("Failed to wipe swap signature on %s", name);
   1295  1.1.1.3  haad 			return 0;
   1296  1.1.1.3  haad 		}
   1297  1.1.1.3  haad 	}
   1298  1.1.1.3  haad 
   1299  1.1.1.3  haad 	if (wipe_swap == -1) {
   1300  1.1.1.3  haad 		log_error("Fatal error while trying to detect swap "
   1301  1.1.1.3  haad 			  "signature on %s", name);
   1302  1.1.1.3  haad 		return 0;
   1303  1.1.1.3  haad 	}
   1304  1.1.1.3  haad 
   1305  1.1.1.3  haad 	if (sigint_caught())
   1306  1.1.1.3  haad 		return 0;
   1307  1.1.1.3  haad 
   1308  1.1.1.3  haad 	if (pv && !is_orphan(pv) && pp->force) {
   1309  1.1.1.3  haad 		log_warn("WARNING: Forcing physical volume creation on "
   1310  1.1.1.3  haad 			  "%s%s%s%s", name,
   1311  1.1.1.3  haad 			  !is_orphan(pv) ? " of volume group \"" : "",
   1312  1.1.1.3  haad 			  !is_orphan(pv) ? pv_vg_name(pv) : "",
   1313  1.1.1.3  haad 			  !is_orphan(pv) ? "\"" : "");
   1314  1.1.1.3  haad 	}
   1315  1.1.1.3  haad 
   1316  1.1.1.3  haad 	return 1;
   1317  1.1.1.3  haad }
   1318  1.1.1.3  haad 
   1319  1.1.1.3  haad void pvcreate_params_set_defaults(struct pvcreate_params *pp)
   1320  1.1.1.3  haad {
   1321  1.1.1.3  haad 	memset(pp, 0, sizeof(*pp));
   1322  1.1.1.3  haad 	pp->zero = 1;
   1323  1.1.1.3  haad 	pp->size = 0;
   1324  1.1.1.3  haad 	pp->data_alignment = UINT64_C(0);
   1325  1.1.1.3  haad 	pp->data_alignment_offset = UINT64_C(0);
   1326  1.1.1.3  haad 	pp->pvmetadatacopies = DEFAULT_PVMETADATACOPIES;
   1327  1.1.1.3  haad 	pp->pvmetadatasize = DEFAULT_PVMETADATASIZE;
   1328  1.1.1.3  haad 	pp->labelsector = DEFAULT_LABELSECTOR;
   1329  1.1.1.3  haad 	pp->idp = 0;
   1330  1.1.1.3  haad 	pp->pe_start = 0;
   1331  1.1.1.3  haad 	pp->extent_count = 0;
   1332  1.1.1.3  haad 	pp->extent_size = 0;
   1333  1.1.1.3  haad 	pp->restorefile = 0;
   1334  1.1.1.3  haad 	pp->force = PROMPT;
   1335  1.1.1.3  haad 	pp->yes = 0;
   1336  1.1.1.3  haad }
   1337  1.1.1.3  haad 
   1338  1.1.1.3  haad /*
   1339  1.1.1.3  haad  * pvcreate_single() - initialize a device with PV label and metadata area
   1340      1.1  haad  *
   1341  1.1.1.3  haad  * Parameters:
   1342  1.1.1.3  haad  * - pv_name: device path to initialize
   1343  1.1.1.3  haad  * - pp: parameters to pass to pv_create; if NULL, use default values
   1344      1.1  haad  *
   1345  1.1.1.3  haad  * Returns:
   1346  1.1.1.3  haad  * NULL: error
   1347  1.1.1.3  haad  * struct physical_volume * (non-NULL): handle to physical volume created
   1348      1.1  haad  */
   1349  1.1.1.3  haad struct physical_volume * pvcreate_single(struct cmd_context *cmd,
   1350  1.1.1.3  haad 					 const char *pv_name,
   1351  1.1.1.3  haad 					 struct pvcreate_params *pp)
   1352  1.1.1.3  haad {
   1353  1.1.1.3  haad 	void *pv;
   1354  1.1.1.3  haad 	struct device *dev;
   1355  1.1.1.3  haad 	struct dm_list mdas;
   1356  1.1.1.3  haad 	struct pvcreate_params default_pp;
   1357  1.1.1.3  haad 	char buffer[64] __attribute((aligned(8)));
   1358  1.1.1.3  haad 
   1359  1.1.1.3  haad 	pvcreate_params_set_defaults(&default_pp);
   1360  1.1.1.3  haad 	if (!pp)
   1361  1.1.1.3  haad 		pp = &default_pp;
   1362  1.1.1.3  haad 
   1363  1.1.1.3  haad 	if (pp->idp) {
   1364  1.1.1.3  haad 		if ((dev = device_from_pvid(cmd, pp->idp)) &&
   1365  1.1.1.3  haad 		    (dev != dev_cache_get(pv_name, cmd->filter))) {
   1366  1.1.1.3  haad 			if (!id_write_format((const struct id*)&pp->idp->uuid,
   1367  1.1.1.3  haad 			    buffer, sizeof(buffer)))
   1368  1.1.1.3  haad 				return_NULL;
   1369  1.1.1.3  haad 			log_error("uuid %s already in use on \"%s\"", buffer,
   1370  1.1.1.3  haad 				  dev_name(dev));
   1371  1.1.1.3  haad 			return NULL;
   1372  1.1.1.3  haad 		}
   1373  1.1.1.3  haad 	}
   1374  1.1.1.3  haad 
   1375  1.1.1.3  haad 	if (!pvcreate_check(cmd, pv_name, pp))
   1376  1.1.1.3  haad 		goto error;
   1377  1.1.1.3  haad 
   1378  1.1.1.3  haad 	if (sigint_caught())
   1379  1.1.1.3  haad 		goto error;
   1380  1.1.1.3  haad 
   1381  1.1.1.3  haad 	if (!(dev = dev_cache_get(pv_name, cmd->filter))) {
   1382  1.1.1.3  haad 		log_error("%s: Couldn't find device.  Check your filters?",
   1383  1.1.1.3  haad 			  pv_name);
   1384  1.1.1.3  haad 		goto error;
   1385  1.1.1.3  haad 	}
   1386  1.1.1.3  haad 
   1387  1.1.1.3  haad 	dm_list_init(&mdas);
   1388  1.1.1.3  haad 	if (!(pv = pv_create(cmd, dev, pp->idp, pp->size,
   1389  1.1.1.3  haad 			     pp->data_alignment, pp->data_alignment_offset,
   1390  1.1.1.3  haad 			     pp->pe_start, pp->extent_count, pp->extent_size,
   1391  1.1.1.3  haad 			     pp->pvmetadatacopies,
   1392  1.1.1.3  haad 			     pp->pvmetadatasize,&mdas))) {
   1393  1.1.1.3  haad 		log_error("Failed to setup physical volume \"%s\"", pv_name);
   1394  1.1.1.3  haad 		goto error;
   1395  1.1.1.3  haad 	}
   1396  1.1.1.3  haad 
   1397  1.1.1.3  haad 	log_verbose("Set up physical volume for \"%s\" with %" PRIu64
   1398  1.1.1.3  haad 		    " available sectors", pv_name, pv_size(pv));
   1399  1.1.1.3  haad 
   1400  1.1.1.3  haad 	/* Wipe existing label first */
   1401  1.1.1.3  haad 	if (!label_remove(pv_dev(pv))) {
   1402  1.1.1.3  haad 		log_error("Failed to wipe existing label on %s", pv_name);
   1403  1.1.1.3  haad 		goto error;
   1404  1.1.1.3  haad 	}
   1405  1.1.1.3  haad 
   1406  1.1.1.3  haad 	if (pp->zero) {
   1407  1.1.1.3  haad 		log_verbose("Zeroing start of device %s", pv_name);
   1408  1.1.1.3  haad 		if (!dev_open_quiet(dev)) {
   1409  1.1.1.3  haad 			log_error("%s not opened: device not zeroed", pv_name);
   1410  1.1.1.3  haad 			goto error;
   1411  1.1.1.3  haad 		}
   1412  1.1.1.3  haad 
   1413  1.1.1.3  haad 		if (!dev_set(dev, UINT64_C(0), (size_t) 2048, 0)) {
   1414  1.1.1.3  haad 			log_error("%s not wiped: aborting", pv_name);
   1415  1.1.1.3  haad 			dev_close(dev);
   1416  1.1.1.3  haad 			goto error;
   1417  1.1.1.3  haad 		}
   1418  1.1.1.3  haad 		dev_close(dev);
   1419  1.1.1.3  haad 	}
   1420  1.1.1.3  haad 
   1421  1.1.1.3  haad 	log_very_verbose("Writing physical volume data to disk \"%s\"",
   1422  1.1.1.3  haad 			 pv_name);
   1423  1.1.1.3  haad 	if (!(pv_write(cmd, (struct physical_volume *)pv, &mdas,
   1424  1.1.1.3  haad 		       pp->labelsector))) {
   1425  1.1.1.3  haad 		log_error("Failed to write physical volume \"%s\"", pv_name);
   1426  1.1.1.3  haad 		goto error;
   1427  1.1.1.3  haad 	}
   1428  1.1.1.3  haad 
   1429  1.1.1.3  haad 	log_print("Physical volume \"%s\" successfully created", pv_name);
   1430  1.1.1.3  haad 
   1431  1.1.1.3  haad 	return pv;
   1432  1.1.1.3  haad 
   1433  1.1.1.3  haad       error:
   1434  1.1.1.3  haad 	return NULL;
   1435      1.1  haad }
   1436      1.1  haad 
   1437      1.1  haad static void _free_pv(struct dm_pool *mem, struct physical_volume *pv)
   1438      1.1  haad {
   1439      1.1  haad 	dm_pool_free(mem, pv);
   1440      1.1  haad }
   1441      1.1  haad 
   1442      1.1  haad static struct physical_volume *_alloc_pv(struct dm_pool *mem, struct device *dev)
   1443      1.1  haad {
   1444      1.1  haad 	struct physical_volume *pv = dm_pool_zalloc(mem, sizeof(*pv));
   1445      1.1  haad 
   1446      1.1  haad 	if (!pv)
   1447      1.1  haad 		return_NULL;
   1448      1.1  haad 
   1449      1.1  haad 	if (!(pv->vg_name = dm_pool_zalloc(mem, NAME_LEN))) {
   1450      1.1  haad 		dm_pool_free(mem, pv);
   1451      1.1  haad 		return NULL;
   1452      1.1  haad 	}
   1453      1.1  haad 
   1454      1.1  haad 	pv->pe_size = 0;
   1455      1.1  haad 	pv->pe_start = 0;
   1456      1.1  haad 	pv->pe_count = 0;
   1457      1.1  haad 	pv->pe_alloc_count = 0;
   1458      1.1  haad 	pv->pe_align = 0;
   1459  1.1.1.3  haad 	pv->pe_align_offset = 0;
   1460      1.1  haad 	pv->fmt = NULL;
   1461      1.1  haad 	pv->dev = dev;
   1462      1.1  haad 
   1463      1.1  haad 	pv->status = ALLOCATABLE_PV;
   1464      1.1  haad 
   1465      1.1  haad 	dm_list_init(&pv->tags);
   1466      1.1  haad 	dm_list_init(&pv->segments);
   1467      1.1  haad 
   1468      1.1  haad 	return pv;
   1469      1.1  haad }
   1470      1.1  haad 
   1471  1.1.1.3  haad /**
   1472  1.1.1.3  haad  * pv_create - initialize a physical volume for use with a volume group
   1473  1.1.1.3  haad  *
   1474  1.1.1.3  haad  * @fmt: format type
   1475  1.1.1.3  haad  * @dev: PV device to initialize
   1476  1.1.1.3  haad  * @size: size of the PV in sectors
   1477  1.1.1.3  haad  * @data_alignment: requested alignment of data
   1478  1.1.1.3  haad  * @data_alignment_offset: requested offset to aligned data
   1479  1.1.1.3  haad  * @pe_start: physical extent start
   1480  1.1.1.3  haad  * @existing_extent_count
   1481  1.1.1.3  haad  * @existing_extent_size
   1482  1.1.1.3  haad  * @pvmetadatacopies
   1483  1.1.1.3  haad  * @pvmetadatasize
   1484  1.1.1.3  haad  * @mdas
   1485  1.1.1.3  haad  *
   1486  1.1.1.3  haad  * Returns:
   1487  1.1.1.3  haad  *   PV handle - physical volume initialized successfully
   1488  1.1.1.3  haad  *   NULL - invalid parameter or problem initializing the physical volume
   1489  1.1.1.3  haad  *
   1490  1.1.1.3  haad  * Note:
   1491  1.1.1.3  haad  *   FIXME: shorten argument list and replace with explict 'set' functions
   1492  1.1.1.3  haad  */
   1493  1.1.1.3  haad struct physical_volume *pv_create(const struct cmd_context *cmd,
   1494      1.1  haad 				  struct device *dev,
   1495      1.1  haad 				  struct id *id, uint64_t size,
   1496  1.1.1.3  haad 				  unsigned long data_alignment,
   1497  1.1.1.3  haad 				  unsigned long data_alignment_offset,
   1498      1.1  haad 				  uint64_t pe_start,
   1499      1.1  haad 				  uint32_t existing_extent_count,
   1500      1.1  haad 				  uint32_t existing_extent_size,
   1501      1.1  haad 				  int pvmetadatacopies,
   1502      1.1  haad 				  uint64_t pvmetadatasize, struct dm_list *mdas)
   1503      1.1  haad {
   1504  1.1.1.3  haad 	const struct format_type *fmt = cmd->fmt;
   1505      1.1  haad 	struct dm_pool *mem = fmt->cmd->mem;
   1506      1.1  haad 	struct physical_volume *pv = _alloc_pv(mem, dev);
   1507      1.1  haad 
   1508      1.1  haad 	if (!pv)
   1509      1.1  haad 		return NULL;
   1510      1.1  haad 
   1511      1.1  haad 	if (id)
   1512      1.1  haad 		memcpy(&pv->id, id, sizeof(*id));
   1513      1.1  haad 	else if (!id_create(&pv->id)) {
   1514      1.1  haad 		log_error("Failed to create random uuid for %s.",
   1515      1.1  haad 			  dev_name(dev));
   1516      1.1  haad 		goto bad;
   1517      1.1  haad 	}
   1518      1.1  haad 
   1519      1.1  haad 	if (!dev_get_size(pv->dev, &pv->size)) {
   1520      1.1  haad 		log_error("%s: Couldn't get size.", pv_dev_name(pv));
   1521      1.1  haad 		goto bad;
   1522      1.1  haad 	}
   1523      1.1  haad 
   1524      1.1  haad 	if (size) {
   1525      1.1  haad 		if (size > pv->size)
   1526      1.1  haad 			log_warn("WARNING: %s: Overriding real size. "
   1527      1.1  haad 				  "You could lose data.", pv_dev_name(pv));
   1528      1.1  haad 		log_verbose("%s: Pretending size is %" PRIu64 " sectors.",
   1529      1.1  haad 			    pv_dev_name(pv), size);
   1530      1.1  haad 		pv->size = size;
   1531      1.1  haad 	}
   1532      1.1  haad 
   1533      1.1  haad 	if (pv->size < PV_MIN_SIZE) {
   1534      1.1  haad 		log_error("%s: Size must exceed minimum of %ld sectors.",
   1535      1.1  haad 			  pv_dev_name(pv), PV_MIN_SIZE);
   1536      1.1  haad 		goto bad;
   1537      1.1  haad 	}
   1538      1.1  haad 
   1539  1.1.1.3  haad 	if (pv->size < data_alignment) {
   1540  1.1.1.3  haad 		log_error("%s: Data alignment must not exceed device size.",
   1541  1.1.1.3  haad 			  pv_dev_name(pv));
   1542  1.1.1.3  haad 		goto bad;
   1543  1.1.1.3  haad 	}
   1544  1.1.1.3  haad 
   1545      1.1  haad 	pv->fmt = fmt;
   1546      1.1  haad 	pv->vg_name = fmt->orphan_vg_name;
   1547      1.1  haad 
   1548      1.1  haad 	if (!fmt->ops->pv_setup(fmt, pe_start, existing_extent_count,
   1549  1.1.1.3  haad 				existing_extent_size, data_alignment,
   1550  1.1.1.3  haad 				data_alignment_offset,
   1551      1.1  haad 				pvmetadatacopies, pvmetadatasize, mdas,
   1552      1.1  haad 				pv, NULL)) {
   1553      1.1  haad 		log_error("%s: Format-specific setup of physical volume "
   1554      1.1  haad 			  "failed.", pv_dev_name(pv));
   1555      1.1  haad 		goto bad;
   1556      1.1  haad 	}
   1557  1.1.1.3  haad 
   1558      1.1  haad 	return pv;
   1559      1.1  haad 
   1560      1.1  haad       bad:
   1561      1.1  haad 	_free_pv(mem, pv);
   1562      1.1  haad 	return NULL;
   1563      1.1  haad }
   1564      1.1  haad 
   1565      1.1  haad /* FIXME: liblvm todo - make into function that returns handle */
   1566      1.1  haad struct pv_list *find_pv_in_vg(const struct volume_group *vg,
   1567      1.1  haad 			      const char *pv_name)
   1568      1.1  haad {
   1569      1.1  haad 	return _find_pv_in_vg(vg, pv_name);
   1570      1.1  haad }
   1571      1.1  haad 
   1572      1.1  haad static struct pv_list *_find_pv_in_vg(const struct volume_group *vg,
   1573      1.1  haad 				      const char *pv_name)
   1574      1.1  haad {
   1575      1.1  haad 	struct pv_list *pvl;
   1576      1.1  haad 
   1577      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs)
   1578      1.1  haad 		if (pvl->pv->dev == dev_cache_get(pv_name, vg->cmd->filter))
   1579      1.1  haad 			return pvl;
   1580      1.1  haad 
   1581      1.1  haad 	return NULL;
   1582      1.1  haad }
   1583      1.1  haad 
   1584      1.1  haad struct pv_list *find_pv_in_pv_list(const struct dm_list *pl,
   1585      1.1  haad 				   const struct physical_volume *pv)
   1586      1.1  haad {
   1587      1.1  haad 	struct pv_list *pvl;
   1588      1.1  haad 
   1589      1.1  haad 	dm_list_iterate_items(pvl, pl)
   1590      1.1  haad 		if (pvl->pv == pv)
   1591      1.1  haad 			return pvl;
   1592      1.1  haad 
   1593      1.1  haad 	return NULL;
   1594      1.1  haad }
   1595      1.1  haad 
   1596      1.1  haad int pv_is_in_vg(struct volume_group *vg, struct physical_volume *pv)
   1597      1.1  haad {
   1598      1.1  haad 	struct pv_list *pvl;
   1599      1.1  haad 
   1600      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs)
   1601      1.1  haad 		if (pv == pvl->pv)
   1602      1.1  haad 			 return 1;
   1603      1.1  haad 
   1604      1.1  haad 	return 0;
   1605      1.1  haad }
   1606      1.1  haad 
   1607      1.1  haad /**
   1608      1.1  haad  * find_pv_in_vg_by_uuid - Find PV in VG by PV UUID
   1609      1.1  haad  * @vg: volume group to search
   1610      1.1  haad  * @id: UUID of the PV to match
   1611      1.1  haad  *
   1612      1.1  haad  * Returns:
   1613      1.1  haad  *   PV handle - if UUID of PV found in VG
   1614      1.1  haad  *   NULL - invalid parameter or UUID of PV not found in VG
   1615      1.1  haad  *
   1616      1.1  haad  * Note
   1617      1.1  haad  *   FIXME - liblvm todo - make into function that takes VG handle
   1618      1.1  haad  */
   1619  1.1.1.3  haad struct physical_volume *find_pv_in_vg_by_uuid(const struct volume_group *vg,
   1620      1.1  haad 			    const struct id *id)
   1621      1.1  haad {
   1622      1.1  haad 	return _find_pv_in_vg_by_uuid(vg, id);
   1623      1.1  haad }
   1624      1.1  haad 
   1625      1.1  haad 
   1626      1.1  haad static struct physical_volume *_find_pv_in_vg_by_uuid(const struct volume_group *vg,
   1627      1.1  haad 						      const struct id *id)
   1628      1.1  haad {
   1629      1.1  haad 	struct pv_list *pvl;
   1630      1.1  haad 
   1631      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs)
   1632      1.1  haad 		if (id_equal(&pvl->pv->id, id))
   1633      1.1  haad 			return pvl->pv;
   1634      1.1  haad 
   1635      1.1  haad 	return NULL;
   1636      1.1  haad }
   1637      1.1  haad 
   1638      1.1  haad struct lv_list *find_lv_in_vg(const struct volume_group *vg,
   1639      1.1  haad 			      const char *lv_name)
   1640      1.1  haad {
   1641      1.1  haad 	struct lv_list *lvl;
   1642      1.1  haad 	const char *ptr;
   1643      1.1  haad 
   1644      1.1  haad 	/* Use last component */
   1645      1.1  haad 	if ((ptr = strrchr(lv_name, '/')))
   1646      1.1  haad 		ptr++;
   1647      1.1  haad 	else
   1648      1.1  haad 		ptr = lv_name;
   1649      1.1  haad 
   1650      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs)
   1651      1.1  haad 		if (!strcmp(lvl->lv->name, ptr))
   1652      1.1  haad 			return lvl;
   1653      1.1  haad 
   1654      1.1  haad 	return NULL;
   1655      1.1  haad }
   1656      1.1  haad 
   1657      1.1  haad struct lv_list *find_lv_in_lv_list(const struct dm_list *ll,
   1658      1.1  haad 				   const struct logical_volume *lv)
   1659      1.1  haad {
   1660      1.1  haad 	struct lv_list *lvl;
   1661      1.1  haad 
   1662      1.1  haad 	dm_list_iterate_items(lvl, ll)
   1663      1.1  haad 		if (lvl->lv == lv)
   1664      1.1  haad 			return lvl;
   1665      1.1  haad 
   1666      1.1  haad 	return NULL;
   1667      1.1  haad }
   1668      1.1  haad 
   1669      1.1  haad struct lv_list *find_lv_in_vg_by_lvid(struct volume_group *vg,
   1670      1.1  haad 				      const union lvid *lvid)
   1671      1.1  haad {
   1672      1.1  haad 	struct lv_list *lvl;
   1673      1.1  haad 
   1674      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs)
   1675      1.1  haad 		if (!strncmp(lvl->lv->lvid.s, lvid->s, sizeof(*lvid)))
   1676      1.1  haad 			return lvl;
   1677      1.1  haad 
   1678      1.1  haad 	return NULL;
   1679      1.1  haad }
   1680      1.1  haad 
   1681      1.1  haad struct logical_volume *find_lv(const struct volume_group *vg,
   1682      1.1  haad 			       const char *lv_name)
   1683      1.1  haad {
   1684      1.1  haad 	struct lv_list *lvl = find_lv_in_vg(vg, lv_name);
   1685      1.1  haad 	return lvl ? lvl->lv : NULL;
   1686      1.1  haad }
   1687      1.1  haad 
   1688      1.1  haad struct physical_volume *find_pv(struct volume_group *vg, struct device *dev)
   1689      1.1  haad {
   1690      1.1  haad 	struct pv_list *pvl;
   1691      1.1  haad 
   1692      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs)
   1693      1.1  haad 		if (dev == pvl->pv->dev)
   1694      1.1  haad 			return pvl->pv;
   1695      1.1  haad 
   1696      1.1  haad 	return NULL;
   1697      1.1  haad }
   1698      1.1  haad 
   1699      1.1  haad /* FIXME: liblvm todo - make into function that returns handle */
   1700      1.1  haad struct physical_volume *find_pv_by_name(struct cmd_context *cmd,
   1701      1.1  haad 					const char *pv_name)
   1702      1.1  haad {
   1703      1.1  haad 	return _find_pv_by_name(cmd, pv_name);
   1704      1.1  haad }
   1705      1.1  haad 
   1706      1.1  haad 
   1707      1.1  haad static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd,
   1708      1.1  haad 			 			const char *pv_name)
   1709      1.1  haad {
   1710      1.1  haad 	struct physical_volume *pv;
   1711      1.1  haad 
   1712  1.1.1.3  haad 	if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, NULL, 1, 0))) {
   1713      1.1  haad 		log_error("Physical volume %s not found", pv_name);
   1714      1.1  haad 		return NULL;
   1715      1.1  haad 	}
   1716      1.1  haad 
   1717      1.1  haad 	if (is_orphan_vg(pv->vg_name)) {
   1718      1.1  haad 		/* If a PV has no MDAs - need to search all VGs for it */
   1719      1.1  haad 		if (!scan_vgs_for_pvs(cmd))
   1720      1.1  haad 			return_NULL;
   1721  1.1.1.3  haad 		if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, NULL, 1, 0))) {
   1722      1.1  haad 			log_error("Physical volume %s not found", pv_name);
   1723      1.1  haad 			return NULL;
   1724      1.1  haad 		}
   1725      1.1  haad 	}
   1726      1.1  haad 
   1727      1.1  haad 	if (is_orphan_vg(pv->vg_name)) {
   1728      1.1  haad 		log_error("Physical volume %s not in a volume group", pv_name);
   1729      1.1  haad 		return NULL;
   1730      1.1  haad 	}
   1731      1.1  haad 
   1732      1.1  haad 	return pv;
   1733      1.1  haad }
   1734      1.1  haad 
   1735      1.1  haad /* Find segment at a given logical extent in an LV */
   1736      1.1  haad struct lv_segment *find_seg_by_le(const struct logical_volume *lv, uint32_t le)
   1737      1.1  haad {
   1738      1.1  haad 	struct lv_segment *seg;
   1739      1.1  haad 
   1740      1.1  haad 	dm_list_iterate_items(seg, &lv->segments)
   1741      1.1  haad 		if (le >= seg->le && le < seg->le + seg->len)
   1742      1.1  haad 			return seg;
   1743      1.1  haad 
   1744      1.1  haad 	return NULL;
   1745      1.1  haad }
   1746      1.1  haad 
   1747      1.1  haad struct lv_segment *first_seg(const struct logical_volume *lv)
   1748      1.1  haad {
   1749  1.1.1.3  haad 	struct lv_segment *seg;
   1750      1.1  haad 
   1751      1.1  haad 	dm_list_iterate_items(seg, &lv->segments)
   1752  1.1.1.3  haad 		return seg;
   1753      1.1  haad 
   1754  1.1.1.3  haad 	return NULL;
   1755      1.1  haad }
   1756      1.1  haad 
   1757      1.1  haad /* Find segment at a given physical extent in a PV */
   1758      1.1  haad struct pv_segment *find_peg_by_pe(const struct physical_volume *pv, uint32_t pe)
   1759      1.1  haad {
   1760      1.1  haad 	struct pv_segment *peg;
   1761      1.1  haad 
   1762      1.1  haad 	dm_list_iterate_items(peg, &pv->segments)
   1763      1.1  haad 		if (pe >= peg->pe && pe < peg->pe + peg->len)
   1764      1.1  haad 			return peg;
   1765      1.1  haad 
   1766      1.1  haad 	return NULL;
   1767      1.1  haad }
   1768      1.1  haad 
   1769  1.1.1.3  haad int vg_remove_mdas(struct volume_group *vg)
   1770      1.1  haad {
   1771      1.1  haad 	struct metadata_area *mda;
   1772      1.1  haad 
   1773      1.1  haad 	/* FIXME Improve recovery situation? */
   1774      1.1  haad 	/* Remove each copy of the metadata */
   1775      1.1  haad 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   1776      1.1  haad 		if (mda->ops->vg_remove &&
   1777      1.1  haad 		    !mda->ops->vg_remove(vg->fid, vg, mda))
   1778      1.1  haad 			return_0;
   1779      1.1  haad 	}
   1780      1.1  haad 
   1781      1.1  haad 	return 1;
   1782      1.1  haad }
   1783      1.1  haad 
   1784  1.1.1.3  haad unsigned snapshot_count(const struct volume_group *vg)
   1785  1.1.1.2  haad {
   1786  1.1.1.2  haad 	struct lv_list *lvl;
   1787  1.1.1.3  haad 	unsigned num_snapshots = 0;
   1788  1.1.1.2  haad 
   1789  1.1.1.2  haad 	dm_list_iterate_items(lvl, &vg->lvs)
   1790  1.1.1.3  haad 		if (lv_is_cow(lvl->lv))
   1791  1.1.1.3  haad 			num_snapshots++;
   1792  1.1.1.3  haad 
   1793  1.1.1.3  haad 	return num_snapshots;
   1794  1.1.1.3  haad }
   1795  1.1.1.3  haad 
   1796  1.1.1.3  haad unsigned vg_visible_lvs(const struct volume_group *vg)
   1797  1.1.1.3  haad {
   1798  1.1.1.3  haad 	struct lv_list *lvl;
   1799  1.1.1.3  haad 	unsigned lv_count = 0;
   1800  1.1.1.3  haad 
   1801  1.1.1.3  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   1802  1.1.1.3  haad 		if (lv_is_visible(lvl->lv))
   1803  1.1.1.2  haad 			lv_count++;
   1804  1.1.1.3  haad 	}
   1805  1.1.1.2  haad 
   1806  1.1.1.2  haad 	return lv_count;
   1807  1.1.1.2  haad }
   1808  1.1.1.2  haad 
   1809      1.1  haad /*
   1810      1.1  haad  * Determine whether two vgs are compatible for merging.
   1811      1.1  haad  */
   1812      1.1  haad int vgs_are_compatible(struct cmd_context *cmd __attribute((unused)),
   1813      1.1  haad 		       struct volume_group *vg_from,
   1814      1.1  haad 		       struct volume_group *vg_to)
   1815      1.1  haad {
   1816      1.1  haad 	struct lv_list *lvl1, *lvl2;
   1817      1.1  haad 	struct pv_list *pvl;
   1818      1.1  haad 	char *name1, *name2;
   1819      1.1  haad 
   1820      1.1  haad 	if (lvs_in_vg_activated(vg_from)) {
   1821      1.1  haad 		log_error("Logical volumes in \"%s\" must be inactive",
   1822      1.1  haad 			  vg_from->name);
   1823      1.1  haad 		return 0;
   1824      1.1  haad 	}
   1825      1.1  haad 
   1826      1.1  haad 	/* Check compatibility */
   1827      1.1  haad 	if (vg_to->extent_size != vg_from->extent_size) {
   1828      1.1  haad 		log_error("Extent sizes differ: %d (%s) and %d (%s)",
   1829      1.1  haad 			  vg_to->extent_size, vg_to->name,
   1830      1.1  haad 			  vg_from->extent_size, vg_from->name);
   1831      1.1  haad 		return 0;
   1832      1.1  haad 	}
   1833      1.1  haad 
   1834      1.1  haad 	if (vg_to->max_pv &&
   1835      1.1  haad 	    (vg_to->max_pv < vg_to->pv_count + vg_from->pv_count)) {
   1836      1.1  haad 		log_error("Maximum number of physical volumes (%d) exceeded "
   1837      1.1  haad 			  " for \"%s\" and \"%s\"", vg_to->max_pv, vg_to->name,
   1838      1.1  haad 			  vg_from->name);
   1839      1.1  haad 		return 0;
   1840      1.1  haad 	}
   1841      1.1  haad 
   1842      1.1  haad 	if (vg_to->max_lv &&
   1843  1.1.1.3  haad 	    (vg_to->max_lv < vg_visible_lvs(vg_to) + vg_visible_lvs(vg_from))) {
   1844      1.1  haad 		log_error("Maximum number of logical volumes (%d) exceeded "
   1845      1.1  haad 			  " for \"%s\" and \"%s\"", vg_to->max_lv, vg_to->name,
   1846      1.1  haad 			  vg_from->name);
   1847      1.1  haad 		return 0;
   1848      1.1  haad 	}
   1849      1.1  haad 
   1850      1.1  haad 	/* Metadata types must be the same */
   1851      1.1  haad 	if (vg_to->fid->fmt != vg_from->fid->fmt) {
   1852      1.1  haad 		log_error("Metadata types differ for \"%s\" and \"%s\"",
   1853      1.1  haad 			  vg_to->name, vg_from->name);
   1854      1.1  haad 		return 0;
   1855      1.1  haad 	}
   1856      1.1  haad 
   1857      1.1  haad 	/* Clustering attribute must be the same */
   1858      1.1  haad 	if (vg_is_clustered(vg_to) != vg_is_clustered(vg_from)) {
   1859      1.1  haad 		log_error("Clustered attribute differs for \"%s\" and \"%s\"",
   1860      1.1  haad 			  vg_to->name, vg_from->name);
   1861      1.1  haad 		return 0;
   1862      1.1  haad 	}
   1863      1.1  haad 
   1864      1.1  haad 	/* Check no conflicts with LV names */
   1865      1.1  haad 	dm_list_iterate_items(lvl1, &vg_to->lvs) {
   1866      1.1  haad 		name1 = lvl1->lv->name;
   1867      1.1  haad 
   1868      1.1  haad 		dm_list_iterate_items(lvl2, &vg_from->lvs) {
   1869      1.1  haad 			name2 = lvl2->lv->name;
   1870      1.1  haad 
   1871      1.1  haad 			if (!strcmp(name1, name2)) {
   1872      1.1  haad 				log_error("Duplicate logical volume "
   1873      1.1  haad 					  "name \"%s\" "
   1874      1.1  haad 					  "in \"%s\" and \"%s\"",
   1875      1.1  haad 					  name1, vg_to->name, vg_from->name);
   1876      1.1  haad 				return 0;
   1877      1.1  haad 			}
   1878      1.1  haad 		}
   1879      1.1  haad 	}
   1880      1.1  haad 
   1881      1.1  haad 	/* Check no PVs are constructed from either VG */
   1882      1.1  haad 	dm_list_iterate_items(pvl, &vg_to->pvs) {
   1883      1.1  haad 		if (pv_uses_vg(pvl->pv, vg_from)) {
   1884      1.1  haad 			log_error("Physical volume %s might be constructed "
   1885      1.1  haad 				  "from same volume group %s.",
   1886      1.1  haad 				  pv_dev_name(pvl->pv), vg_from->name);
   1887      1.1  haad 			return 0;
   1888      1.1  haad 		}
   1889      1.1  haad 	}
   1890      1.1  haad 
   1891      1.1  haad 	dm_list_iterate_items(pvl, &vg_from->pvs) {
   1892      1.1  haad 		if (pv_uses_vg(pvl->pv, vg_to)) {
   1893      1.1  haad 			log_error("Physical volume %s might be constructed "
   1894      1.1  haad 				  "from same volume group %s.",
   1895      1.1  haad 				  pv_dev_name(pvl->pv), vg_to->name);
   1896      1.1  haad 			return 0;
   1897      1.1  haad 		}
   1898      1.1  haad 	}
   1899      1.1  haad 
   1900      1.1  haad 	return 1;
   1901      1.1  haad }
   1902      1.1  haad 
   1903      1.1  haad struct _lv_postorder_baton {
   1904      1.1  haad 	int (*fn)(struct logical_volume *lv, void *data);
   1905      1.1  haad 	void *data;
   1906      1.1  haad };
   1907      1.1  haad 
   1908      1.1  haad static int _lv_postorder_visit(struct logical_volume *,
   1909      1.1  haad 			       int (*fn)(struct logical_volume *lv, void *data),
   1910      1.1  haad 			       void *data);
   1911      1.1  haad 
   1912      1.1  haad static int _lv_postorder_level(struct logical_volume *lv, void *data)
   1913      1.1  haad {
   1914      1.1  haad 	struct _lv_postorder_baton *baton = data;
   1915      1.1  haad 	if (lv->status & POSTORDER_OPEN_FLAG)
   1916      1.1  haad 		return 1; // a data structure loop has closed...
   1917      1.1  haad 	lv->status |= POSTORDER_OPEN_FLAG;
   1918      1.1  haad 	int r =_lv_postorder_visit(lv, baton->fn, baton->data);
   1919      1.1  haad 	lv->status &= ~POSTORDER_OPEN_FLAG;
   1920      1.1  haad 	lv->status |= POSTORDER_FLAG;
   1921      1.1  haad 	return r;
   1922      1.1  haad };
   1923      1.1  haad 
   1924      1.1  haad static int _lv_each_dependency(struct logical_volume *lv,
   1925      1.1  haad 			       int (*fn)(struct logical_volume *lv, void *data),
   1926      1.1  haad 			       void *data)
   1927      1.1  haad {
   1928      1.1  haad 	int i, s;
   1929      1.1  haad 	struct lv_segment *lvseg;
   1930      1.1  haad 
   1931      1.1  haad 	struct logical_volume *deps[] = {
   1932      1.1  haad 		lv->snapshot ? lv->snapshot->origin : 0,
   1933      1.1  haad 		lv->snapshot ? lv->snapshot->cow : 0 };
   1934      1.1  haad 	for (i = 0; i < sizeof(deps) / sizeof(*deps); ++i) {
   1935      1.1  haad 		if (deps[i] && !fn(deps[i], data))
   1936      1.1  haad 			return_0;
   1937      1.1  haad 	}
   1938      1.1  haad 
   1939      1.1  haad 	dm_list_iterate_items(lvseg, &lv->segments) {
   1940      1.1  haad 		if (lvseg->log_lv && !fn(lvseg->log_lv, data))
   1941      1.1  haad 			return_0;
   1942      1.1  haad 		for (s = 0; s < lvseg->area_count; ++s) {
   1943      1.1  haad 			if (seg_type(lvseg, s) == AREA_LV && !fn(seg_lv(lvseg,s), data))
   1944      1.1  haad 				return_0;
   1945      1.1  haad 		}
   1946      1.1  haad 	}
   1947      1.1  haad 	return 1;
   1948      1.1  haad }
   1949      1.1  haad 
   1950      1.1  haad static int _lv_postorder_cleanup(struct logical_volume *lv, void *data)
   1951      1.1  haad {
   1952      1.1  haad 	if (!(lv->status & POSTORDER_FLAG))
   1953      1.1  haad 		return 1;
   1954      1.1  haad 	lv->status &= ~POSTORDER_FLAG;
   1955      1.1  haad 
   1956      1.1  haad 	if (!_lv_each_dependency(lv, _lv_postorder_cleanup, data))
   1957      1.1  haad 		return_0;
   1958      1.1  haad 	return 1;
   1959      1.1  haad }
   1960      1.1  haad 
   1961      1.1  haad static int _lv_postorder_visit(struct logical_volume *lv,
   1962      1.1  haad 			       int (*fn)(struct logical_volume *lv, void *data),
   1963      1.1  haad 			       void *data)
   1964      1.1  haad {
   1965      1.1  haad 	struct _lv_postorder_baton baton;
   1966      1.1  haad 	int r;
   1967      1.1  haad 
   1968      1.1  haad 	if (lv->status & POSTORDER_FLAG)
   1969      1.1  haad 		return 1;
   1970      1.1  haad 
   1971      1.1  haad 	baton.fn = fn;
   1972      1.1  haad 	baton.data = data;
   1973      1.1  haad 	r = _lv_each_dependency(lv, _lv_postorder_level, &baton);
   1974  1.1.1.3  haad 	if (r)
   1975      1.1  haad 		r = fn(lv, data);
   1976  1.1.1.3  haad 
   1977      1.1  haad 	return r;
   1978      1.1  haad }
   1979      1.1  haad 
   1980      1.1  haad /*
   1981      1.1  haad  * This will walk the LV dependency graph in depth-first order and in the
   1982      1.1  haad  * postorder, call a callback function "fn". The void *data is passed along all
   1983      1.1  haad  * the calls. The callback may return zero to indicate an error and terminate
   1984      1.1  haad  * the depth-first walk. The error is propagated to return value of
   1985      1.1  haad  * _lv_postorder.
   1986      1.1  haad  */
   1987      1.1  haad static int _lv_postorder(struct logical_volume *lv,
   1988      1.1  haad 			       int (*fn)(struct logical_volume *lv, void *data),
   1989      1.1  haad 			       void *data)
   1990      1.1  haad {
   1991      1.1  haad 	int r;
   1992      1.1  haad 	r = _lv_postorder_visit(lv, fn, data);
   1993      1.1  haad 	_lv_postorder_cleanup(lv, 0);
   1994      1.1  haad 	return r;
   1995      1.1  haad }
   1996      1.1  haad 
   1997      1.1  haad struct _lv_mark_if_partial_baton {
   1998      1.1  haad 	int partial;
   1999      1.1  haad };
   2000      1.1  haad 
   2001      1.1  haad static int _lv_mark_if_partial_collect(struct logical_volume *lv, void *data)
   2002      1.1  haad {
   2003      1.1  haad 	struct _lv_mark_if_partial_baton *baton = data;
   2004      1.1  haad 	if (lv->status & PARTIAL_LV)
   2005      1.1  haad 		baton->partial = 1;
   2006      1.1  haad 
   2007      1.1  haad 	return 1;
   2008      1.1  haad }
   2009      1.1  haad 
   2010      1.1  haad static int _lv_mark_if_partial_single(struct logical_volume *lv, void *data)
   2011      1.1  haad {
   2012      1.1  haad 	int s;
   2013      1.1  haad 	struct _lv_mark_if_partial_baton baton;
   2014      1.1  haad 	struct lv_segment *lvseg;
   2015      1.1  haad 
   2016      1.1  haad 	dm_list_iterate_items(lvseg, &lv->segments) {
   2017      1.1  haad 		for (s = 0; s < lvseg->area_count; ++s) {
   2018      1.1  haad 			if (seg_type(lvseg, s) == AREA_PV) {
   2019      1.1  haad 				if (seg_pv(lvseg, s)->status & MISSING_PV)
   2020      1.1  haad 					lv->status |= PARTIAL_LV;
   2021      1.1  haad 			}
   2022      1.1  haad 		}
   2023      1.1  haad 	}
   2024      1.1  haad 
   2025      1.1  haad 	baton.partial = 0;
   2026      1.1  haad 	_lv_each_dependency(lv, _lv_mark_if_partial_collect, &baton);
   2027      1.1  haad 
   2028      1.1  haad 	if (baton.partial)
   2029      1.1  haad 		lv->status |= PARTIAL_LV;
   2030      1.1  haad 
   2031      1.1  haad 	return 1;
   2032      1.1  haad }
   2033      1.1  haad 
   2034      1.1  haad static int _lv_mark_if_partial(struct logical_volume *lv)
   2035      1.1  haad {
   2036      1.1  haad 	return _lv_postorder(lv, _lv_mark_if_partial_single, NULL);
   2037      1.1  haad }
   2038      1.1  haad 
   2039      1.1  haad /*
   2040      1.1  haad  * Mark LVs with missing PVs using PARTIAL_LV status flag. The flag is
   2041      1.1  haad  * propagated transitively, so LVs referencing other LVs are marked
   2042      1.1  haad  * partial as well, if any of their referenced LVs are marked partial.
   2043      1.1  haad  */
   2044      1.1  haad static int _vg_mark_partial_lvs(struct volume_group *vg)
   2045      1.1  haad {
   2046      1.1  haad 	struct logical_volume *lv;
   2047      1.1  haad 	struct lv_list *lvl;
   2048      1.1  haad 
   2049      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   2050      1.1  haad 		lv = lvl->lv;
   2051      1.1  haad 		if (!_lv_mark_if_partial(lv))
   2052      1.1  haad 			return_0;
   2053      1.1  haad 	}
   2054      1.1  haad 	return 1;
   2055      1.1  haad }
   2056      1.1  haad 
   2057  1.1.1.3  haad /*
   2058  1.1.1.3  haad  * Be sure that all PV devices have cached read ahead in dev-cache
   2059  1.1.1.3  haad  * Currently it takes read_ahead from first PV segment only
   2060  1.1.1.3  haad  */
   2061  1.1.1.3  haad static int _lv_read_ahead_single(struct logical_volume *lv, void *data)
   2062  1.1.1.3  haad {
   2063  1.1.1.3  haad 	struct lv_segment *seg = first_seg(lv);
   2064  1.1.1.3  haad 	uint32_t seg_read_ahead = 0, *read_ahead = data;
   2065  1.1.1.3  haad 
   2066  1.1.1.3  haad 	if (seg && seg->area_count && seg_type(seg, 0) == AREA_PV)
   2067  1.1.1.3  haad 		dev_get_read_ahead(seg_pv(seg, 0)->dev, &seg_read_ahead);
   2068  1.1.1.3  haad 
   2069  1.1.1.3  haad 	if (seg_read_ahead > *read_ahead)
   2070  1.1.1.3  haad 		*read_ahead = seg_read_ahead;
   2071  1.1.1.3  haad 
   2072  1.1.1.3  haad 	return 1;
   2073  1.1.1.3  haad }
   2074  1.1.1.3  haad 
   2075  1.1.1.3  haad /*
   2076  1.1.1.3  haad  * Calculate readahead for logical volume from underlying PV devices.
   2077  1.1.1.3  haad  * If read_ahead is NULL, only ensure that readahead of PVs are preloaded
   2078  1.1.1.3  haad  * into PV struct device in dev cache.
   2079  1.1.1.3  haad  */
   2080  1.1.1.3  haad void lv_calculate_readahead(const struct logical_volume *lv, uint32_t *read_ahead)
   2081  1.1.1.3  haad {
   2082  1.1.1.3  haad 	uint32_t _read_ahead = 0;
   2083  1.1.1.3  haad 
   2084  1.1.1.3  haad 	if (lv->read_ahead == DM_READ_AHEAD_AUTO)
   2085  1.1.1.3  haad 		_lv_postorder((struct logical_volume *)lv, _lv_read_ahead_single, &_read_ahead);
   2086  1.1.1.3  haad 
   2087  1.1.1.3  haad 	if (read_ahead) {
   2088  1.1.1.3  haad 		log_debug("Calculated readahead of LV %s is %u", lv->name, _read_ahead);
   2089  1.1.1.3  haad 		*read_ahead = _read_ahead;
   2090  1.1.1.3  haad 	}
   2091  1.1.1.3  haad }
   2092  1.1.1.3  haad 
   2093      1.1  haad int vg_validate(struct volume_group *vg)
   2094      1.1  haad {
   2095      1.1  haad 	struct pv_list *pvl, *pvl2;
   2096      1.1  haad 	struct lv_list *lvl, *lvl2;
   2097      1.1  haad 	char uuid[64] __attribute((aligned(8)));
   2098      1.1  haad 	int r = 1;
   2099  1.1.1.3  haad 	uint32_t hidden_lv_count = 0;
   2100      1.1  haad 
   2101      1.1  haad 	/* FIXME Also check there's no data/metadata overlap */
   2102      1.1  haad 
   2103      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
   2104      1.1  haad 		dm_list_iterate_items(pvl2, &vg->pvs) {
   2105      1.1  haad 			if (pvl == pvl2)
   2106      1.1  haad 				break;
   2107      1.1  haad 			if (id_equal(&pvl->pv->id,
   2108      1.1  haad 				     &pvl2->pv->id)) {
   2109      1.1  haad 				if (!id_write_format(&pvl->pv->id, uuid,
   2110      1.1  haad 						     sizeof(uuid)))
   2111      1.1  haad 					 stack;
   2112      1.1  haad 				log_error("Internal error: Duplicate PV id "
   2113      1.1  haad 					  "%s detected for %s in %s.",
   2114      1.1  haad 					  uuid, pv_dev_name(pvl->pv),
   2115      1.1  haad 					  vg->name);
   2116      1.1  haad 				r = 0;
   2117      1.1  haad 			}
   2118      1.1  haad 		}
   2119      1.1  haad 
   2120      1.1  haad 		if (strcmp(pvl->pv->vg_name, vg->name)) {
   2121      1.1  haad 			log_error("Internal error: VG name for PV %s is corrupted",
   2122      1.1  haad 				  pv_dev_name(pvl->pv));
   2123      1.1  haad 			r = 0;
   2124      1.1  haad 		}
   2125      1.1  haad 	}
   2126      1.1  haad 
   2127      1.1  haad 	if (!check_pv_segments(vg)) {
   2128      1.1  haad 		log_error("Internal error: PV segments corrupted in %s.",
   2129      1.1  haad 			  vg->name);
   2130      1.1  haad 		r = 0;
   2131      1.1  haad 	}
   2132      1.1  haad 
   2133  1.1.1.3  haad 	/*
   2134  1.1.1.3  haad 	 * Count all non-snapshot invisible LVs
   2135  1.1.1.3  haad 	 */
   2136  1.1.1.3  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   2137  1.1.1.3  haad 		if (lvl->lv->status & VISIBLE_LV)
   2138  1.1.1.3  haad 			continue;
   2139  1.1.1.3  haad 
   2140  1.1.1.3  haad 		/* snapshots */
   2141  1.1.1.3  haad 		if (lv_is_cow(lvl->lv))
   2142  1.1.1.3  haad 			continue;
   2143  1.1.1.3  haad 
   2144  1.1.1.3  haad 		/* virtual origins are always hidden */
   2145  1.1.1.3  haad 		if (lv_is_origin(lvl->lv) && !lv_is_virtual_origin(lvl->lv))
   2146  1.1.1.3  haad 			continue;
   2147  1.1.1.3  haad 
   2148  1.1.1.3  haad 		/* count other non-snapshot invisible volumes */
   2149  1.1.1.3  haad 		hidden_lv_count++;
   2150  1.1.1.3  haad 
   2151  1.1.1.3  haad 		/*
   2152  1.1.1.3  haad 		 *  FIXME: add check for unreferenced invisible LVs
   2153  1.1.1.3  haad 		 *   - snapshot cow & origin
   2154  1.1.1.3  haad 		 *   - mirror log & images
   2155  1.1.1.3  haad 		 *   - mirror conversion volumes (_mimagetmp*)
   2156  1.1.1.3  haad 		 */
   2157  1.1.1.3  haad 	}
   2158  1.1.1.3  haad 
   2159  1.1.1.3  haad 	/*
   2160  1.1.1.3  haad 	 * all volumes = visible LVs + snapshot_cows + invisible LVs
   2161  1.1.1.3  haad 	 */
   2162  1.1.1.3  haad 	if (((uint32_t) dm_list_size(&vg->lvs)) !=
   2163  1.1.1.3  haad 	    vg_visible_lvs(vg) + snapshot_count(vg) + hidden_lv_count) {
   2164      1.1  haad 		log_error("Internal error: #internal LVs (%u) != #LVs (%"
   2165  1.1.1.3  haad 			  PRIu32 ") + #snapshots (%" PRIu32 ") + #internal LVs %u in VG %s",
   2166  1.1.1.3  haad 			  dm_list_size(&vg->lvs), vg_visible_lvs(vg),
   2167  1.1.1.3  haad 			  snapshot_count(vg), hidden_lv_count, vg->name);
   2168      1.1  haad 		r = 0;
   2169      1.1  haad 	}
   2170      1.1  haad 
   2171      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   2172      1.1  haad 		dm_list_iterate_items(lvl2, &vg->lvs) {
   2173      1.1  haad 			if (lvl == lvl2)
   2174      1.1  haad 				break;
   2175      1.1  haad 			if (!strcmp(lvl->lv->name, lvl2->lv->name)) {
   2176      1.1  haad 				log_error("Internal error: Duplicate LV name "
   2177      1.1  haad 					  "%s detected in %s.", lvl->lv->name,
   2178      1.1  haad 					  vg->name);
   2179      1.1  haad 				r = 0;
   2180      1.1  haad 			}
   2181      1.1  haad 			if (id_equal(&lvl->lv->lvid.id[1],
   2182      1.1  haad 				     &lvl2->lv->lvid.id[1])) {
   2183      1.1  haad 				if (!id_write_format(&lvl->lv->lvid.id[1], uuid,
   2184      1.1  haad 						     sizeof(uuid)))
   2185      1.1  haad 					 stack;
   2186      1.1  haad 				log_error("Internal error: Duplicate LV id "
   2187      1.1  haad 					  "%s detected for %s and %s in %s.",
   2188      1.1  haad 					  uuid, lvl->lv->name, lvl2->lv->name,
   2189      1.1  haad 					  vg->name);
   2190      1.1  haad 				r = 0;
   2191      1.1  haad 			}
   2192      1.1  haad 		}
   2193      1.1  haad 	}
   2194      1.1  haad 
   2195      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   2196      1.1  haad 		if (!check_lv_segments(lvl->lv, 1)) {
   2197      1.1  haad 			log_error("Internal error: LV segments corrupted in %s.",
   2198      1.1  haad 				  lvl->lv->name);
   2199      1.1  haad 			r = 0;
   2200      1.1  haad 		}
   2201      1.1  haad 	}
   2202      1.1  haad 
   2203      1.1  haad 	if (!(vg->fid->fmt->features & FMT_UNLIMITED_VOLS) &&
   2204      1.1  haad 	    (!vg->max_lv || !vg->max_pv)) {
   2205      1.1  haad 		log_error("Internal error: Volume group %s has limited PV/LV count"
   2206      1.1  haad 			  " but limit is not set.", vg->name);
   2207      1.1  haad 		r = 0;
   2208      1.1  haad 	}
   2209      1.1  haad 
   2210  1.1.1.3  haad 	if (vg_max_lv_reached(vg))
   2211  1.1.1.3  haad 		stack;
   2212  1.1.1.3  haad 
   2213      1.1  haad 	return r;
   2214      1.1  haad }
   2215      1.1  haad 
   2216      1.1  haad /*
   2217      1.1  haad  * After vg_write() returns success,
   2218      1.1  haad  * caller MUST call either vg_commit() or vg_revert()
   2219      1.1  haad  */
   2220      1.1  haad int vg_write(struct volume_group *vg)
   2221      1.1  haad {
   2222      1.1  haad 	struct dm_list *mdah;
   2223      1.1  haad 	struct metadata_area *mda;
   2224      1.1  haad 
   2225      1.1  haad 	if (!vg_validate(vg))
   2226      1.1  haad 		return_0;
   2227      1.1  haad 
   2228      1.1  haad 	if (vg->status & PARTIAL_VG) {
   2229      1.1  haad 		log_error("Cannot update partial volume group %s.", vg->name);
   2230      1.1  haad 		return 0;
   2231      1.1  haad 	}
   2232      1.1  haad 
   2233      1.1  haad 	if (vg_missing_pv_count(vg) && !vg->cmd->handles_missing_pvs) {
   2234      1.1  haad 		log_error("Cannot update volume group %s while physical "
   2235      1.1  haad 			  "volumes are missing.", vg->name);
   2236      1.1  haad 		return 0;
   2237      1.1  haad 	}
   2238      1.1  haad 
   2239  1.1.1.3  haad 	if (vg_has_unknown_segments(vg) && !vg->cmd->handles_unknown_segments) {
   2240  1.1.1.3  haad 		log_error("Cannot update volume group %s with unknown segments in it!",
   2241  1.1.1.3  haad 			  vg->name);
   2242  1.1.1.3  haad 		return 0;
   2243  1.1.1.3  haad 	}
   2244  1.1.1.3  haad 
   2245  1.1.1.3  haad 
   2246      1.1  haad 	if (dm_list_empty(&vg->fid->metadata_areas)) {
   2247      1.1  haad 		log_error("Aborting vg_write: No metadata areas to write to!");
   2248      1.1  haad 		return 0;
   2249      1.1  haad 	}
   2250      1.1  haad 
   2251      1.1  haad 	if (!drop_cached_metadata(vg)) {
   2252      1.1  haad 		log_error("Unable to drop cached metadata for VG %s.", vg->name);
   2253      1.1  haad 		return 0;
   2254      1.1  haad 	}
   2255      1.1  haad 
   2256      1.1  haad 	vg->seqno++;
   2257      1.1  haad 
   2258      1.1  haad 	/* Write to each copy of the metadata area */
   2259      1.1  haad 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   2260      1.1  haad 		if (!mda->ops->vg_write) {
   2261      1.1  haad 			log_error("Format does not support writing volume"
   2262      1.1  haad 				  "group metadata areas");
   2263      1.1  haad 			/* Revert */
   2264      1.1  haad 			dm_list_uniterate(mdah, &vg->fid->metadata_areas, &mda->list) {
   2265      1.1  haad 				mda = dm_list_item(mdah, struct metadata_area);
   2266      1.1  haad 
   2267      1.1  haad 				if (mda->ops->vg_revert &&
   2268      1.1  haad 				    !mda->ops->vg_revert(vg->fid, vg, mda)) {
   2269      1.1  haad 					stack;
   2270      1.1  haad 				}
   2271      1.1  haad 			}
   2272      1.1  haad 			return 0;
   2273      1.1  haad 		}
   2274      1.1  haad 		if (!mda->ops->vg_write(vg->fid, vg, mda)) {
   2275      1.1  haad 			stack;
   2276      1.1  haad 			/* Revert */
   2277      1.1  haad 			dm_list_uniterate(mdah, &vg->fid->metadata_areas, &mda->list) {
   2278      1.1  haad 				mda = dm_list_item(mdah, struct metadata_area);
   2279      1.1  haad 
   2280      1.1  haad 				if (mda->ops->vg_revert &&
   2281      1.1  haad 				    !mda->ops->vg_revert(vg->fid, vg, mda)) {
   2282      1.1  haad 					stack;
   2283      1.1  haad 				}
   2284      1.1  haad 			}
   2285      1.1  haad 			return 0;
   2286      1.1  haad 		}
   2287      1.1  haad 	}
   2288      1.1  haad 
   2289      1.1  haad 	/* Now pre-commit each copy of the new metadata */
   2290      1.1  haad 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   2291      1.1  haad 		if (mda->ops->vg_precommit &&
   2292      1.1  haad 		    !mda->ops->vg_precommit(vg->fid, vg, mda)) {
   2293      1.1  haad 			stack;
   2294      1.1  haad 			/* Revert */
   2295      1.1  haad 			dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   2296      1.1  haad 				if (mda->ops->vg_revert &&
   2297      1.1  haad 				    !mda->ops->vg_revert(vg->fid, vg, mda)) {
   2298      1.1  haad 					stack;
   2299      1.1  haad 				}
   2300      1.1  haad 			}
   2301      1.1  haad 			return 0;
   2302      1.1  haad 		}
   2303      1.1  haad 	}
   2304      1.1  haad 
   2305      1.1  haad 	return 1;
   2306      1.1  haad }
   2307      1.1  haad 
   2308      1.1  haad /* Commit pending changes */
   2309      1.1  haad int vg_commit(struct volume_group *vg)
   2310      1.1  haad {
   2311      1.1  haad 	struct metadata_area *mda;
   2312      1.1  haad 	int cache_updated = 0;
   2313      1.1  haad 	int failed = 0;
   2314      1.1  haad 
   2315      1.1  haad 	if (!vgname_is_locked(vg->name)) {
   2316      1.1  haad 		log_error("Internal error: Attempt to write new VG metadata "
   2317      1.1  haad 			  "without locking %s", vg->name);
   2318      1.1  haad 		return cache_updated;
   2319      1.1  haad 	}
   2320      1.1  haad 
   2321      1.1  haad 	/* Commit to each copy of the metadata area */
   2322      1.1  haad 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   2323      1.1  haad 		failed = 0;
   2324      1.1  haad 		if (mda->ops->vg_commit &&
   2325      1.1  haad 		    !mda->ops->vg_commit(vg->fid, vg, mda)) {
   2326      1.1  haad 			stack;
   2327      1.1  haad 			failed = 1;
   2328      1.1  haad 		}
   2329      1.1  haad 		/* Update cache first time we succeed */
   2330      1.1  haad 		if (!failed && !cache_updated) {
   2331      1.1  haad 			lvmcache_update_vg(vg, 0);
   2332      1.1  haad 			cache_updated = 1;
   2333      1.1  haad 		}
   2334      1.1  haad 	}
   2335      1.1  haad 
   2336      1.1  haad 	/* If update failed, remove any cached precommitted metadata. */
   2337      1.1  haad 	if (!cache_updated && !drop_cached_metadata(vg))
   2338      1.1  haad 		log_error("Attempt to drop cached metadata failed "
   2339      1.1  haad 			  "after commit for VG %s.", vg->name);
   2340      1.1  haad 
   2341      1.1  haad 	/* If at least one mda commit succeeded, it was committed */
   2342      1.1  haad 	return cache_updated;
   2343      1.1  haad }
   2344      1.1  haad 
   2345      1.1  haad /* Don't commit any pending changes */
   2346      1.1  haad int vg_revert(struct volume_group *vg)
   2347      1.1  haad {
   2348      1.1  haad 	struct metadata_area *mda;
   2349      1.1  haad 
   2350      1.1  haad 	dm_list_iterate_items(mda, &vg->fid->metadata_areas) {
   2351      1.1  haad 		if (mda->ops->vg_revert &&
   2352      1.1  haad 		    !mda->ops->vg_revert(vg->fid, vg, mda)) {
   2353      1.1  haad 			stack;
   2354      1.1  haad 		}
   2355      1.1  haad 	}
   2356      1.1  haad 
   2357      1.1  haad 	if (!drop_cached_metadata(vg))
   2358      1.1  haad 		log_error("Attempt to drop cached metadata failed "
   2359      1.1  haad 			  "after reverted update for VG %s.", vg->name);
   2360      1.1  haad 
   2361      1.1  haad 	return 1;
   2362      1.1  haad }
   2363      1.1  haad 
   2364      1.1  haad /* Make orphan PVs look like a VG */
   2365      1.1  haad static struct volume_group *_vg_read_orphans(struct cmd_context *cmd,
   2366      1.1  haad 					     const char *orphan_vgname)
   2367      1.1  haad {
   2368      1.1  haad 	struct lvmcache_vginfo *vginfo;
   2369      1.1  haad 	struct lvmcache_info *info;
   2370      1.1  haad 	struct pv_list *pvl;
   2371      1.1  haad 	struct volume_group *vg;
   2372      1.1  haad 	struct physical_volume *pv;
   2373  1.1.1.3  haad 	struct dm_pool *mem;
   2374      1.1  haad 
   2375      1.1  haad 	lvmcache_label_scan(cmd, 0);
   2376      1.1  haad 
   2377      1.1  haad 	if (!(vginfo = vginfo_from_vgname(orphan_vgname, NULL)))
   2378      1.1  haad 		return_NULL;
   2379      1.1  haad 
   2380  1.1.1.3  haad 	if (!(mem = dm_pool_create("vg_read orphan", VG_MEMPOOL_CHUNK)))
   2381  1.1.1.3  haad 		return_NULL;
   2382  1.1.1.3  haad 
   2383  1.1.1.3  haad 	if (!(vg = dm_pool_zalloc(mem, sizeof(*vg)))) {
   2384      1.1  haad 		log_error("vg allocation failed");
   2385      1.1  haad 		return NULL;
   2386      1.1  haad 	}
   2387      1.1  haad 	dm_list_init(&vg->pvs);
   2388      1.1  haad 	dm_list_init(&vg->lvs);
   2389      1.1  haad 	dm_list_init(&vg->tags);
   2390  1.1.1.3  haad 	dm_list_init(&vg->removed_pvs);
   2391  1.1.1.3  haad 	vg->vgmem = mem;
   2392      1.1  haad 	vg->cmd = cmd;
   2393  1.1.1.3  haad 	if (!(vg->name = dm_pool_strdup(mem, orphan_vgname))) {
   2394      1.1  haad 		log_error("vg name allocation failed");
   2395  1.1.1.3  haad 		goto bad;
   2396      1.1  haad 	}
   2397      1.1  haad 
   2398      1.1  haad 	/* create format instance with appropriate metadata area */
   2399      1.1  haad 	if (!(vg->fid = vginfo->fmt->ops->create_instance(vginfo->fmt,
   2400      1.1  haad 							  orphan_vgname, NULL,
   2401      1.1  haad 							  NULL))) {
   2402      1.1  haad 		log_error("Failed to create format instance");
   2403  1.1.1.3  haad 		goto bad;
   2404      1.1  haad 	}
   2405      1.1  haad 
   2406      1.1  haad 	dm_list_iterate_items(info, &vginfo->infos) {
   2407  1.1.1.3  haad 		if (!(pv = _pv_read(cmd, mem, dev_name(info->dev), NULL, NULL, 1, 0))) {
   2408      1.1  haad 			continue;
   2409      1.1  haad 		}
   2410  1.1.1.3  haad 		if (!(pvl = dm_pool_zalloc(mem, sizeof(*pvl)))) {
   2411      1.1  haad 			log_error("pv_list allocation failed");
   2412  1.1.1.3  haad 			goto bad;
   2413      1.1  haad 		}
   2414      1.1  haad 		pvl->pv = pv;
   2415      1.1  haad 		dm_list_add(&vg->pvs, &pvl->list);
   2416      1.1  haad 		vg->pv_count++;
   2417      1.1  haad 	}
   2418      1.1  haad 
   2419      1.1  haad 	return vg;
   2420  1.1.1.3  haad bad:
   2421  1.1.1.3  haad 	dm_pool_destroy(mem);
   2422  1.1.1.3  haad 	return NULL;
   2423      1.1  haad }
   2424      1.1  haad 
   2425  1.1.1.3  haad static int _update_pv_list(struct dm_pool *pvmem, struct dm_list *all_pvs, struct volume_group *vg)
   2426      1.1  haad {
   2427      1.1  haad 	struct pv_list *pvl, *pvl2;
   2428      1.1  haad 
   2429      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
   2430      1.1  haad 		dm_list_iterate_items(pvl2, all_pvs) {
   2431      1.1  haad 			if (pvl->pv->dev == pvl2->pv->dev)
   2432      1.1  haad 				goto next_pv;
   2433      1.1  haad 		}
   2434  1.1.1.3  haad 
   2435  1.1.1.3  haad 		/*
   2436  1.1.1.3  haad 		 * PV is not on list so add it.
   2437  1.1.1.3  haad 		 */
   2438  1.1.1.3  haad 		if (!(pvl2 = _copy_pvl(pvmem, pvl))) {
   2439      1.1  haad 			log_error("pv_list allocation for '%s' failed",
   2440      1.1  haad 				  pv_dev_name(pvl->pv));
   2441      1.1  haad 			return 0;
   2442      1.1  haad 		}
   2443      1.1  haad 		dm_list_add(all_pvs, &pvl2->list);
   2444      1.1  haad   next_pv:
   2445      1.1  haad 		;
   2446      1.1  haad 	}
   2447      1.1  haad 
   2448      1.1  haad 	return 1;
   2449      1.1  haad }
   2450      1.1  haad 
   2451  1.1.1.3  haad int vg_missing_pv_count(const struct volume_group *vg)
   2452      1.1  haad {
   2453      1.1  haad 	int ret = 0;
   2454      1.1  haad 	struct pv_list *pvl;
   2455      1.1  haad 	dm_list_iterate_items(pvl, &vg->pvs) {
   2456      1.1  haad 		if (pvl->pv->status & MISSING_PV)
   2457      1.1  haad 			++ ret;
   2458      1.1  haad 	}
   2459      1.1  haad 	return ret;
   2460      1.1  haad }
   2461      1.1  haad 
   2462  1.1.1.3  haad /* Caller sets consistent to 1 if it's safe for vg_read_internal to correct
   2463      1.1  haad  * inconsistent metadata on disk (i.e. the VG write lock is held).
   2464      1.1  haad  * This guarantees only consistent metadata is returned.
   2465      1.1  haad  * If consistent is 0, caller must check whether consistent == 1 on return
   2466      1.1  haad  * and take appropriate action if it isn't (e.g. abort; get write lock
   2467  1.1.1.3  haad  * and call vg_read_internal again).
   2468      1.1  haad  *
   2469      1.1  haad  * If precommitted is set, use precommitted metadata if present.
   2470      1.1  haad  *
   2471      1.1  haad  * Either of vgname or vgid may be NULL.
   2472      1.1  haad  */
   2473      1.1  haad static struct volume_group *_vg_read(struct cmd_context *cmd,
   2474      1.1  haad 				     const char *vgname,
   2475      1.1  haad 				     const char *vgid,
   2476      1.1  haad 				     int *consistent, unsigned precommitted)
   2477      1.1  haad {
   2478      1.1  haad 	struct format_instance *fid;
   2479      1.1  haad 	const struct format_type *fmt;
   2480      1.1  haad 	struct volume_group *vg, *correct_vg = NULL;
   2481      1.1  haad 	struct metadata_area *mda;
   2482      1.1  haad 	struct lvmcache_info *info;
   2483      1.1  haad 	int inconsistent = 0;
   2484      1.1  haad 	int inconsistent_vgid = 0;
   2485      1.1  haad 	int inconsistent_pvs = 0;
   2486      1.1  haad 	unsigned use_precommitted = precommitted;
   2487  1.1.1.3  haad 	unsigned saved_handles_missing_pvs = cmd->handles_missing_pvs;
   2488      1.1  haad 	struct dm_list *pvids;
   2489      1.1  haad 	struct pv_list *pvl, *pvl2;
   2490      1.1  haad 	struct dm_list all_pvs;
   2491      1.1  haad 	char uuid[64] __attribute((aligned(8)));
   2492      1.1  haad 
   2493      1.1  haad 	if (is_orphan_vg(vgname)) {
   2494      1.1  haad 		if (use_precommitted) {
   2495  1.1.1.3  haad 			log_error("Internal error: vg_read_internal requires vgname "
   2496      1.1  haad 				  "with pre-commit.");
   2497      1.1  haad 			return NULL;
   2498      1.1  haad 		}
   2499      1.1  haad 		*consistent = 1;
   2500      1.1  haad 		return _vg_read_orphans(cmd, vgname);
   2501      1.1  haad 	}
   2502      1.1  haad 
   2503      1.1  haad 	if ((correct_vg = lvmcache_get_vg(vgid, precommitted))) {
   2504      1.1  haad 		if (vg_missing_pv_count(correct_vg)) {
   2505      1.1  haad 			log_verbose("There are %d physical volumes missing.",
   2506      1.1  haad 				    vg_missing_pv_count(correct_vg));
   2507      1.1  haad 			_vg_mark_partial_lvs(correct_vg);
   2508      1.1  haad 		}
   2509      1.1  haad 		*consistent = 1;
   2510      1.1  haad 		return correct_vg;
   2511      1.1  haad 	}
   2512      1.1  haad 
   2513      1.1  haad 	/* Find the vgname in the cache */
   2514      1.1  haad 	/* If it's not there we must do full scan to be completely sure */
   2515      1.1  haad 	if (!(fmt = fmt_from_vgname(vgname, vgid))) {
   2516      1.1  haad 		lvmcache_label_scan(cmd, 0);
   2517      1.1  haad 		if (!(fmt = fmt_from_vgname(vgname, vgid))) {
   2518      1.1  haad 			if (memlock())
   2519      1.1  haad 				return_NULL;
   2520      1.1  haad 			lvmcache_label_scan(cmd, 2);
   2521      1.1  haad 			if (!(fmt = fmt_from_vgname(vgname, vgid)))
   2522      1.1  haad 				return_NULL;
   2523      1.1  haad 		}
   2524      1.1  haad 	}
   2525      1.1  haad 
   2526      1.1  haad 	/* Now determine the correct vgname if none was supplied */
   2527      1.1  haad 	if (!vgname && !(vgname = vgname_from_vgid(cmd->mem, vgid)))
   2528      1.1  haad 		return_NULL;
   2529      1.1  haad 
   2530      1.1  haad 	if (use_precommitted && !(fmt->features & FMT_PRECOMMIT))
   2531      1.1  haad 		use_precommitted = 0;
   2532      1.1  haad 
   2533      1.1  haad 	/* create format instance with appropriate metadata area */
   2534      1.1  haad 	if (!(fid = fmt->ops->create_instance(fmt, vgname, vgid, NULL))) {
   2535      1.1  haad 		log_error("Failed to create format instance");
   2536      1.1  haad 		return NULL;
   2537      1.1  haad 	}
   2538      1.1  haad 
   2539      1.1  haad 	/* Store pvids for later so we can check if any are missing */
   2540      1.1  haad 	if (!(pvids = lvmcache_get_pvids(cmd, vgname, vgid)))
   2541      1.1  haad 		return_NULL;
   2542      1.1  haad 
   2543      1.1  haad 	/* Ensure contents of all metadata areas match - else do recovery */
   2544      1.1  haad 	dm_list_iterate_items(mda, &fid->metadata_areas) {
   2545      1.1  haad 		if ((use_precommitted &&
   2546      1.1  haad 		     !(vg = mda->ops->vg_read_precommit(fid, vgname, mda))) ||
   2547      1.1  haad 		    (!use_precommitted &&
   2548      1.1  haad 		     !(vg = mda->ops->vg_read(fid, vgname, mda)))) {
   2549      1.1  haad 			inconsistent = 1;
   2550  1.1.1.3  haad 			vg_release(vg);
   2551      1.1  haad 			continue;
   2552      1.1  haad 		}
   2553      1.1  haad 		if (!correct_vg) {
   2554      1.1  haad 			correct_vg = vg;
   2555      1.1  haad 			continue;
   2556      1.1  haad 		}
   2557  1.1.1.3  haad 
   2558      1.1  haad 		/* FIXME Also ensure contents same - checksum compare? */
   2559      1.1  haad 		if (correct_vg->seqno != vg->seqno) {
   2560      1.1  haad 			inconsistent = 1;
   2561  1.1.1.3  haad 			if (vg->seqno > correct_vg->seqno) {
   2562  1.1.1.3  haad 				vg_release(correct_vg);
   2563      1.1  haad 				correct_vg = vg;
   2564  1.1.1.3  haad 			}
   2565      1.1  haad 		}
   2566  1.1.1.3  haad 
   2567  1.1.1.3  haad 		if (vg != correct_vg)
   2568  1.1.1.3  haad 			vg_release(vg);
   2569      1.1  haad 	}
   2570      1.1  haad 
   2571      1.1  haad 	/* Ensure every PV in the VG was in the cache */
   2572      1.1  haad 	if (correct_vg) {
   2573      1.1  haad 		/*
   2574      1.1  haad 		 * If the VG has PVs without mdas, they may still be
   2575      1.1  haad 		 * orphans in the cache: update the cache state here.
   2576      1.1  haad 		 */
   2577      1.1  haad 		if (!inconsistent &&
   2578      1.1  haad 		    dm_list_size(&correct_vg->pvs) > dm_list_size(pvids)) {
   2579      1.1  haad 			dm_list_iterate_items(pvl, &correct_vg->pvs) {
   2580      1.1  haad 				if (!pvl->pv->dev) {
   2581      1.1  haad 					inconsistent_pvs = 1;
   2582      1.1  haad 					break;
   2583      1.1  haad 				}
   2584      1.1  haad 
   2585      1.1  haad 				if (str_list_match_item(pvids, pvl->pv->dev->pvid))
   2586      1.1  haad 					continue;
   2587      1.1  haad 
   2588      1.1  haad 				/*
   2589      1.1  haad 				 * PV not marked as belonging to this VG in cache.
   2590      1.1  haad 				 * Check it's an orphan without metadata area.
   2591      1.1  haad 				 */
   2592      1.1  haad 				if (!(info = info_from_pvid(pvl->pv->dev->pvid, 1)) ||
   2593      1.1  haad 				   !info->vginfo || !is_orphan_vg(info->vginfo->vgname) ||
   2594      1.1  haad 				   dm_list_size(&info->mdas)) {
   2595      1.1  haad 					inconsistent_pvs = 1;
   2596      1.1  haad 					break;
   2597      1.1  haad 				}
   2598      1.1  haad 			}
   2599      1.1  haad 
   2600      1.1  haad 			/* If the check passed, let's update VG and recalculate pvids */
   2601      1.1  haad 			if (!inconsistent_pvs) {
   2602      1.1  haad 				log_debug("Updating cache for PVs without mdas "
   2603      1.1  haad 					  "in VG %s.", vgname);
   2604      1.1  haad 				lvmcache_update_vg(correct_vg, use_precommitted);
   2605      1.1  haad 
   2606      1.1  haad 				if (!(pvids = lvmcache_get_pvids(cmd, vgname, vgid)))
   2607      1.1  haad 					return_NULL;
   2608      1.1  haad 			}
   2609      1.1  haad 		}
   2610      1.1  haad 
   2611      1.1  haad 		if (dm_list_size(&correct_vg->pvs) != dm_list_size(pvids)
   2612      1.1  haad 		    + vg_missing_pv_count(correct_vg)) {
   2613      1.1  haad 			log_debug("Cached VG %s had incorrect PV list",
   2614      1.1  haad 				  vgname);
   2615      1.1  haad 
   2616      1.1  haad 			if (memlock())
   2617      1.1  haad 				inconsistent = 1;
   2618  1.1.1.3  haad 			else {
   2619  1.1.1.3  haad 				vg_release(correct_vg);
   2620      1.1  haad 				correct_vg = NULL;
   2621  1.1.1.3  haad 			}
   2622      1.1  haad 		} else dm_list_iterate_items(pvl, &correct_vg->pvs) {
   2623      1.1  haad 			if (pvl->pv->status & MISSING_PV)
   2624      1.1  haad 				continue;
   2625      1.1  haad 			if (!str_list_match_item(pvids, pvl->pv->dev->pvid)) {
   2626      1.1  haad 				log_debug("Cached VG %s had incorrect PV list",
   2627      1.1  haad 					  vgname);
   2628  1.1.1.3  haad 				vg_release(correct_vg);
   2629      1.1  haad 				correct_vg = NULL;
   2630      1.1  haad 				break;
   2631      1.1  haad 			}
   2632      1.1  haad 		}
   2633      1.1  haad 	}
   2634      1.1  haad 
   2635      1.1  haad 	dm_list_init(&all_pvs);
   2636      1.1  haad 
   2637      1.1  haad 	/* Failed to find VG where we expected it - full scan and retry */
   2638      1.1  haad 	if (!correct_vg) {
   2639      1.1  haad 		inconsistent = 0;
   2640      1.1  haad 
   2641      1.1  haad 		if (memlock())
   2642      1.1  haad 			return_NULL;
   2643      1.1  haad 		lvmcache_label_scan(cmd, 2);
   2644      1.1  haad 		if (!(fmt = fmt_from_vgname(vgname, vgid)))
   2645      1.1  haad 			return_NULL;
   2646      1.1  haad 
   2647      1.1  haad 		if (precommitted && !(fmt->features & FMT_PRECOMMIT))
   2648      1.1  haad 			use_precommitted = 0;
   2649      1.1  haad 
   2650      1.1  haad 		/* create format instance with appropriate metadata area */
   2651      1.1  haad 		if (!(fid = fmt->ops->create_instance(fmt, vgname, vgid, NULL))) {
   2652      1.1  haad 			log_error("Failed to create format instance");
   2653      1.1  haad 			return NULL;
   2654      1.1  haad 		}
   2655      1.1  haad 
   2656      1.1  haad 		/* Ensure contents of all metadata areas match - else recover */
   2657      1.1  haad 		dm_list_iterate_items(mda, &fid->metadata_areas) {
   2658      1.1  haad 			if ((use_precommitted &&
   2659      1.1  haad 			     !(vg = mda->ops->vg_read_precommit(fid, vgname,
   2660      1.1  haad 								mda))) ||
   2661      1.1  haad 			    (!use_precommitted &&
   2662      1.1  haad 			     !(vg = mda->ops->vg_read(fid, vgname, mda)))) {
   2663      1.1  haad 				inconsistent = 1;
   2664      1.1  haad 				continue;
   2665      1.1  haad 			}
   2666      1.1  haad 			if (!correct_vg) {
   2667      1.1  haad 				correct_vg = vg;
   2668  1.1.1.3  haad 				if (!_update_pv_list(cmd->mem, &all_pvs, correct_vg)) {
   2669  1.1.1.3  haad 					vg_release(vg);
   2670      1.1  haad 					return_NULL;
   2671  1.1.1.3  haad 				}
   2672      1.1  haad 				continue;
   2673      1.1  haad 			}
   2674      1.1  haad 
   2675      1.1  haad 			if (strncmp((char *)vg->id.uuid,
   2676      1.1  haad 			    (char *)correct_vg->id.uuid, ID_LEN)) {
   2677      1.1  haad 				inconsistent = 1;
   2678      1.1  haad 				inconsistent_vgid = 1;
   2679      1.1  haad 			}
   2680      1.1  haad 
   2681      1.1  haad 			/* FIXME Also ensure contents same - checksums same? */
   2682      1.1  haad 			if (correct_vg->seqno != vg->seqno) {
   2683      1.1  haad 				inconsistent = 1;
   2684  1.1.1.3  haad 				if (!_update_pv_list(cmd->mem, &all_pvs, vg)) {
   2685  1.1.1.3  haad 					vg_release(vg);
   2686  1.1.1.3  haad 					vg_release(correct_vg);
   2687      1.1  haad 					return_NULL;
   2688  1.1.1.3  haad 				}
   2689  1.1.1.3  haad 				if (vg->seqno > correct_vg->seqno) {
   2690  1.1.1.3  haad 					vg_release(correct_vg);
   2691      1.1  haad 					correct_vg = vg;
   2692  1.1.1.3  haad 				}
   2693      1.1  haad 			}
   2694  1.1.1.3  haad 
   2695  1.1.1.3  haad 			if (vg != correct_vg)
   2696  1.1.1.3  haad 				vg_release(vg);
   2697      1.1  haad 		}
   2698      1.1  haad 
   2699      1.1  haad 		/* Give up looking */
   2700      1.1  haad 		if (!correct_vg)
   2701      1.1  haad 			return_NULL;
   2702      1.1  haad 	}
   2703      1.1  haad 
   2704      1.1  haad 	lvmcache_update_vg(correct_vg, use_precommitted);
   2705      1.1  haad 
   2706      1.1  haad 	if (inconsistent) {
   2707      1.1  haad 		/* FIXME Test should be if we're *using* precommitted metadata not if we were searching for it */
   2708      1.1  haad 		if (use_precommitted) {
   2709      1.1  haad 			log_error("Inconsistent pre-commit metadata copies "
   2710      1.1  haad 				  "for volume group %s", vgname);
   2711  1.1.1.3  haad 			vg_release(correct_vg);
   2712      1.1  haad 			return NULL;
   2713      1.1  haad 		}
   2714      1.1  haad 
   2715      1.1  haad 		if (!*consistent)
   2716      1.1  haad 			return correct_vg;
   2717      1.1  haad 
   2718      1.1  haad 		/* Don't touch if vgids didn't match */
   2719      1.1  haad 		if (inconsistent_vgid) {
   2720      1.1  haad 			log_error("Inconsistent metadata UUIDs found for "
   2721      1.1  haad 				  "volume group %s", vgname);
   2722      1.1  haad 			*consistent = 0;
   2723      1.1  haad 			return correct_vg;
   2724      1.1  haad 		}
   2725      1.1  haad 
   2726      1.1  haad 		log_warn("WARNING: Inconsistent metadata found for VG %s - updating "
   2727      1.1  haad 			 "to use version %u", vgname, correct_vg->seqno);
   2728      1.1  haad 
   2729  1.1.1.3  haad 		cmd->handles_missing_pvs = 1;
   2730      1.1  haad 		if (!vg_write(correct_vg)) {
   2731      1.1  haad 			log_error("Automatic metadata correction failed");
   2732  1.1.1.3  haad 			vg_release(correct_vg);
   2733  1.1.1.3  haad 			cmd->handles_missing_pvs = saved_handles_missing_pvs;
   2734      1.1  haad 			return NULL;
   2735      1.1  haad 		}
   2736  1.1.1.3  haad 		cmd->handles_missing_pvs = saved_handles_missing_pvs;
   2737      1.1  haad 
   2738      1.1  haad 		if (!vg_commit(correct_vg)) {
   2739      1.1  haad 			log_error("Automatic metadata correction commit "
   2740      1.1  haad 				  "failed");
   2741  1.1.1.3  haad 			vg_release(correct_vg);
   2742      1.1  haad 			return NULL;
   2743      1.1  haad 		}
   2744      1.1  haad 
   2745      1.1  haad 		dm_list_iterate_items(pvl, &all_pvs) {
   2746      1.1  haad 			dm_list_iterate_items(pvl2, &correct_vg->pvs) {
   2747      1.1  haad 				if (pvl->pv->dev == pvl2->pv->dev)
   2748      1.1  haad 					goto next_pv;
   2749      1.1  haad 			}
   2750  1.1.1.3  haad 			if (!id_write_format(&pvl->pv->id, uuid, sizeof(uuid))) {
   2751  1.1.1.3  haad 				vg_release(correct_vg);
   2752      1.1  haad 				return_NULL;
   2753  1.1.1.3  haad 			}
   2754      1.1  haad 			log_error("Removing PV %s (%s) that no longer belongs to VG %s",
   2755      1.1  haad 				  pv_dev_name(pvl->pv), uuid, correct_vg->name);
   2756  1.1.1.3  haad 			if (!pv_write_orphan(cmd, pvl->pv)) {
   2757  1.1.1.3  haad 				vg_release(correct_vg);
   2758      1.1  haad 				return_NULL;
   2759  1.1.1.3  haad 			}
   2760      1.1  haad       next_pv:
   2761      1.1  haad 			;
   2762      1.1  haad 		}
   2763      1.1  haad 	}
   2764      1.1  haad 
   2765      1.1  haad 	if (vg_missing_pv_count(correct_vg)) {
   2766      1.1  haad 		log_verbose("There are %d physical volumes missing.",
   2767      1.1  haad 			    vg_missing_pv_count(correct_vg));
   2768      1.1  haad 		_vg_mark_partial_lvs(correct_vg);
   2769      1.1  haad 	}
   2770      1.1  haad 
   2771      1.1  haad 	if ((correct_vg->status & PVMOVE) && !pvmove_mode()) {
   2772      1.1  haad 		log_error("WARNING: Interrupted pvmove detected in "
   2773      1.1  haad 			  "volume group %s", correct_vg->name);
   2774      1.1  haad 		log_error("Please restore the metadata by running "
   2775      1.1  haad 			  "vgcfgrestore.");
   2776  1.1.1.3  haad 		vg_release(correct_vg);
   2777      1.1  haad 		return NULL;
   2778      1.1  haad 	}
   2779      1.1  haad 
   2780      1.1  haad 	*consistent = 1;
   2781      1.1  haad 	return correct_vg;
   2782      1.1  haad }
   2783      1.1  haad 
   2784  1.1.1.3  haad struct volume_group *vg_read_internal(struct cmd_context *cmd, const char *vgname,
   2785      1.1  haad 			     const char *vgid, int *consistent)
   2786      1.1  haad {
   2787      1.1  haad 	struct volume_group *vg;
   2788      1.1  haad 	struct lv_list *lvl;
   2789      1.1  haad 
   2790      1.1  haad 	if (!(vg = _vg_read(cmd, vgname, vgid, consistent, 0)))
   2791      1.1  haad 		return NULL;
   2792      1.1  haad 
   2793      1.1  haad 	if (!check_pv_segments(vg)) {
   2794      1.1  haad 		log_error("Internal error: PV segments corrupted in %s.",
   2795      1.1  haad 			  vg->name);
   2796  1.1.1.3  haad 		vg_release(vg);
   2797      1.1  haad 		return NULL;
   2798      1.1  haad 	}
   2799      1.1  haad 
   2800      1.1  haad 	dm_list_iterate_items(lvl, &vg->lvs) {
   2801      1.1  haad 		if (!check_lv_segments(lvl->lv, 1)) {
   2802      1.1  haad 			log_error("Internal error: LV segments corrupted in %s.",
   2803      1.1  haad 				  lvl->lv->name);
   2804  1.1.1.3  haad 			vg_release(vg);
   2805      1.1  haad 			return NULL;
   2806      1.1  haad 		}
   2807      1.1  haad 	}
   2808      1.1  haad 
   2809      1.1  haad 	return vg;
   2810      1.1  haad }
   2811      1.1  haad 
   2812  1.1.1.3  haad void vg_release(struct volume_group *vg)
   2813  1.1.1.3  haad {
   2814  1.1.1.3  haad 	if (!vg || !vg->vgmem)
   2815  1.1.1.3  haad 		return;
   2816  1.1.1.3  haad 
   2817  1.1.1.3  haad 	if (vg->cmd && vg->vgmem == vg->cmd->mem)
   2818  1.1.1.3  haad 		log_error("Internal error: global memory pool used for VG %s",
   2819  1.1.1.3  haad 			  vg->name);
   2820  1.1.1.3  haad 
   2821  1.1.1.3  haad 	dm_pool_destroy(vg->vgmem);
   2822  1.1.1.3  haad }
   2823  1.1.1.3  haad 
   2824      1.1  haad /* This is only called by lv_from_lvid, which is only called from
   2825      1.1  haad  * activate.c so we know the appropriate VG lock is already held and
   2826  1.1.1.3  haad  * the vg_read_internal is therefore safe.
   2827      1.1  haad  */
   2828      1.1  haad static struct volume_group *_vg_read_by_vgid(struct cmd_context *cmd,
   2829      1.1  haad 					    const char *vgid,
   2830      1.1  haad 					    unsigned precommitted)
   2831      1.1  haad {
   2832      1.1  haad 	const char *vgname;
   2833      1.1  haad 	struct dm_list *vgnames;
   2834  1.1.1.3  haad 	struct volume_group *vg = NULL;
   2835      1.1  haad 	struct lvmcache_vginfo *vginfo;
   2836      1.1  haad 	struct str_list *strl;
   2837      1.1  haad 	int consistent = 0;
   2838      1.1  haad 
   2839      1.1  haad 	/* Is corresponding vgname already cached? */
   2840      1.1  haad 	if ((vginfo = vginfo_from_vgid(vgid)) &&
   2841      1.1  haad 	    vginfo->vgname && !is_orphan_vg(vginfo->vgname)) {
   2842      1.1  haad 		if ((vg = _vg_read(cmd, NULL, vgid,
   2843      1.1  haad 				   &consistent, precommitted)) &&
   2844      1.1  haad 		    !strncmp((char *)vg->id.uuid, vgid, ID_LEN)) {
   2845      1.1  haad 
   2846      1.1  haad 			if (!consistent) {
   2847      1.1  haad 				log_error("Volume group %s metadata is "
   2848      1.1  haad 					  "inconsistent", vg->name);
   2849      1.1  haad 			}
   2850      1.1  haad 			return vg;
   2851      1.1  haad 		}
   2852  1.1.1.3  haad 		vg_release(vg);
   2853      1.1  haad 	}
   2854      1.1  haad 
   2855      1.1  haad 	/* Mustn't scan if memory locked: ensure cache gets pre-populated! */
   2856      1.1  haad 	if (memlock())
   2857  1.1.1.3  haad 		goto out;
   2858      1.1  haad 
   2859  1.1.1.3  haad 	/* FIXME Need a genuine read by ID here - don't vg_read_internal by name! */
   2860      1.1  haad 	/* FIXME Disabled vgrenames while active for now because we aren't
   2861      1.1  haad 	 *       allowed to do a full scan here any more. */
   2862      1.1  haad 
   2863      1.1  haad 	// The slow way - full scan required to cope with vgrename
   2864  1.1.1.3  haad 	if (!(vgnames = get_vgnames(cmd, 2))) {
   2865  1.1.1.3  haad 		log_error("vg_read_by_vgid: get_vgnames failed");
   2866  1.1.1.3  haad 		goto out;
   2867      1.1  haad 	}
   2868      1.1  haad 
   2869      1.1  haad 	dm_list_iterate_items(strl, vgnames) {
   2870      1.1  haad 		vgname = strl->str;
   2871      1.1  haad 		if (!vgname || is_orphan_vg(vgname))
   2872      1.1  haad 			continue;	// FIXME Unnecessary?
   2873      1.1  haad 		consistent = 0;
   2874      1.1  haad 		if ((vg = _vg_read(cmd, vgname, vgid, &consistent,
   2875      1.1  haad 				   precommitted)) &&
   2876      1.1  haad 		    !strncmp((char *)vg->id.uuid, vgid, ID_LEN)) {
   2877      1.1  haad 
   2878      1.1  haad 			if (!consistent) {
   2879      1.1  haad 				log_error("Volume group %s metadata is "
   2880      1.1  haad 					  "inconsistent", vgname);
   2881  1.1.1.3  haad 				goto out;
   2882      1.1  haad 			}
   2883      1.1  haad 			return vg;
   2884      1.1  haad 		}
   2885      1.1  haad 	}
   2886      1.1  haad 
   2887  1.1.1.3  haad out:
   2888  1.1.1.3  haad 	vg_release(vg);
   2889      1.1  haad 	return NULL;
   2890      1.1  haad }
   2891      1.1  haad 
   2892      1.1  haad /* Only called by activate.c */
   2893      1.1  haad struct logical_volume *lv_from_lvid(struct cmd_context *cmd, const char *lvid_s,
   2894      1.1  haad 				    unsigned precommitted)
   2895      1.1  haad {
   2896      1.1  haad 	struct lv_list *lvl;
   2897      1.1  haad 	struct volume_group *vg;
   2898      1.1  haad 	const union lvid *lvid;
   2899      1.1  haad 
   2900      1.1  haad 	lvid = (const union lvid *) lvid_s;
   2901      1.1  haad 
   2902      1.1  haad 	log_very_verbose("Finding volume group for uuid %s", lvid_s);
   2903      1.1  haad 	if (!(vg = _vg_read_by_vgid(cmd, (char *)lvid->id[0].uuid, precommitted))) {
   2904      1.1  haad 		log_error("Volume group for uuid not found: %s", lvid_s);
   2905      1.1  haad 		return NULL;
   2906      1.1  haad 	}
   2907      1.1  haad 
   2908      1.1  haad 	log_verbose("Found volume group \"%s\"", vg->name);
   2909      1.1  haad 	if (vg->status & EXPORTED_VG) {
   2910      1.1  haad 		log_error("Volume group \"%s\" is exported", vg->name);
   2911  1.1.1.3  haad 		goto out;
   2912      1.1  haad 	}
   2913      1.1  haad 	if (!(lvl = find_lv_in_vg_by_lvid(vg, lvid))) {
   2914      1.1  haad 		log_very_verbose("Can't find logical volume id %s", lvid_s);
   2915  1.1.1.3  haad 		goto out;
   2916      1.1  haad 	}
   2917      1.1  haad 
   2918      1.1  haad 	return lvl->lv;
   2919  1.1.1.3  haad out:
   2920  1.1.1.3  haad 	vg_release(vg);
   2921  1.1.1.3  haad 	return NULL;
   2922      1.1  haad }
   2923      1.1  haad 
   2924      1.1  haad /**
   2925      1.1  haad  * pv_read - read and return a handle to a physical volume
   2926      1.1  haad  * @cmd: LVM command initiating the pv_read
   2927      1.1  haad  * @pv_name: full device name of the PV, including the path
   2928      1.1  haad  * @mdas: list of metadata areas of the PV
   2929      1.1  haad  * @label_sector: sector number where the PV label is stored on @pv_name
   2930      1.1  haad  * @warnings:
   2931      1.1  haad  *
   2932      1.1  haad  * Returns:
   2933      1.1  haad  *   PV handle - valid pv_name and successful read of the PV, or
   2934      1.1  haad  *   NULL - invalid parameter or error in reading the PV
   2935      1.1  haad  *
   2936      1.1  haad  * Note:
   2937      1.1  haad  *   FIXME - liblvm todo - make into function that returns handle
   2938      1.1  haad  */
   2939      1.1  haad struct physical_volume *pv_read(struct cmd_context *cmd, const char *pv_name,
   2940      1.1  haad 				struct dm_list *mdas, uint64_t *label_sector,
   2941  1.1.1.3  haad 				int warnings, int scan_label_only)
   2942      1.1  haad {
   2943  1.1.1.3  haad 	return _pv_read(cmd, cmd->mem, pv_name, mdas, label_sector, warnings, scan_label_only);
   2944      1.1  haad }
   2945      1.1  haad 
   2946      1.1  haad /* FIXME Use label functions instead of PV functions */
   2947      1.1  haad static struct physical_volume *_pv_read(struct cmd_context *cmd,
   2948  1.1.1.3  haad 					struct dm_pool *pvmem,
   2949      1.1  haad 					const char *pv_name,
   2950      1.1  haad 					struct dm_list *mdas,
   2951      1.1  haad 					uint64_t *label_sector,
   2952  1.1.1.3  haad 					int warnings, int scan_label_only)
   2953      1.1  haad {
   2954      1.1  haad 	struct physical_volume *pv;
   2955      1.1  haad 	struct label *label;
   2956      1.1  haad 	struct lvmcache_info *info;
   2957      1.1  haad 	struct device *dev;
   2958      1.1  haad 
   2959      1.1  haad 	if (!(dev = dev_cache_get(pv_name, cmd->filter)))
   2960      1.1  haad 		return_NULL;
   2961      1.1  haad 
   2962      1.1  haad 	if (!(label_read(dev, &label, UINT64_C(0)))) {
   2963      1.1  haad 		if (warnings)
   2964      1.1  haad 			log_error("No physical volume label read from %s",
   2965      1.1  haad 				  pv_name);
   2966      1.1  haad 		return NULL;
   2967      1.1  haad 	}
   2968      1.1  haad 
   2969      1.1  haad 	info = (struct lvmcache_info *) label->info;
   2970      1.1  haad 	if (label_sector && *label_sector)
   2971      1.1  haad 		*label_sector = label->sector;
   2972      1.1  haad 
   2973  1.1.1.3  haad 	if (!(pv = dm_pool_zalloc(pvmem, sizeof(*pv)))) {
   2974      1.1  haad 		log_error("pv allocation for '%s' failed", pv_name);
   2975      1.1  haad 		return NULL;
   2976      1.1  haad 	}
   2977      1.1  haad 
   2978      1.1  haad 	dm_list_init(&pv->tags);
   2979      1.1  haad 	dm_list_init(&pv->segments);
   2980      1.1  haad 
   2981      1.1  haad 	/* FIXME Move more common code up here */
   2982  1.1.1.3  haad 	if (!(info->fmt->ops->pv_read(info->fmt, pv_name, pv, mdas,
   2983  1.1.1.3  haad 	      scan_label_only))) {
   2984      1.1  haad 		log_error("Failed to read existing physical volume '%s'",
   2985      1.1  haad 			  pv_name);
   2986      1.1  haad 		return NULL;
   2987      1.1  haad 	}
   2988      1.1  haad 
   2989      1.1  haad 	if (!pv->size)
   2990      1.1  haad 		return NULL;
   2991  1.1.1.3  haad 
   2992  1.1.1.3  haad 	if (!alloc_pv_segment_whole_pv(pvmem, pv))
   2993      1.1  haad 		return_NULL;
   2994      1.1  haad 
   2995      1.1  haad 	return pv;
   2996      1.1  haad }
   2997      1.1  haad 
   2998      1.1  haad /* May return empty list */
   2999  1.1.1.3  haad struct dm_list *get_vgnames(struct cmd_context *cmd, int full_scan)
   3000      1.1  haad {
   3001      1.1  haad 	return lvmcache_get_vgnames(cmd, full_scan);
   3002      1.1  haad }
   3003      1.1  haad 
   3004      1.1  haad struct dm_list *get_vgids(struct cmd_context *cmd, int full_scan)
   3005      1.1  haad {
   3006      1.1  haad 	return lvmcache_get_vgids(cmd, full_scan);
   3007      1.1  haad }
   3008      1.1  haad 
   3009      1.1  haad static int _get_pvs(struct cmd_context *cmd, struct dm_list **pvslist)
   3010      1.1  haad {
   3011      1.1  haad 	struct str_list *strl;
   3012      1.1  haad 	struct dm_list * uninitialized_var(results);
   3013      1.1  haad 	const char *vgname, *vgid;
   3014  1.1.1.3  haad 	struct pv_list *pvl, *pvl_copy;
   3015      1.1  haad 	struct dm_list *vgids;
   3016      1.1  haad 	struct volume_group *vg;
   3017      1.1  haad 	int consistent = 0;
   3018      1.1  haad 	int old_pvmove;
   3019      1.1  haad 
   3020      1.1  haad 	lvmcache_label_scan(cmd, 0);
   3021      1.1  haad 
   3022      1.1  haad 	if (pvslist) {
   3023      1.1  haad 		if (!(results = dm_pool_alloc(cmd->mem, sizeof(*results)))) {
   3024      1.1  haad 			log_error("PV list allocation failed");
   3025      1.1  haad 			return 0;
   3026      1.1  haad 		}
   3027      1.1  haad 
   3028      1.1  haad 		dm_list_init(results);
   3029      1.1  haad 	}
   3030      1.1  haad 
   3031      1.1  haad 	/* Get list of VGs */
   3032      1.1  haad 	if (!(vgids = get_vgids(cmd, 0))) {
   3033  1.1.1.3  haad 		log_error("get_pvs: get_vgids failed");
   3034      1.1  haad 		return 0;
   3035      1.1  haad 	}
   3036      1.1  haad 
   3037      1.1  haad 	/* Read every VG to ensure cache consistency */
   3038      1.1  haad 	/* Orphan VG is last on list */
   3039      1.1  haad 	old_pvmove = pvmove_mode();
   3040      1.1  haad 	init_pvmove(1);
   3041      1.1  haad 	dm_list_iterate_items(strl, vgids) {
   3042      1.1  haad 		vgid = strl->str;
   3043      1.1  haad 		if (!vgid)
   3044      1.1  haad 			continue;	/* FIXME Unnecessary? */
   3045      1.1  haad 		consistent = 0;
   3046      1.1  haad 		if (!(vgname = vgname_from_vgid(NULL, vgid))) {
   3047      1.1  haad 			stack;
   3048      1.1  haad 			continue;
   3049      1.1  haad 		}
   3050  1.1.1.3  haad 		if (!(vg = vg_read_internal(cmd, vgname, vgid, &consistent))) {
   3051      1.1  haad 			stack;
   3052      1.1  haad 			continue;
   3053      1.1  haad 		}
   3054      1.1  haad 		if (!consistent)
   3055      1.1  haad 			log_warn("WARNING: Volume Group %s is not consistent",
   3056      1.1  haad 				 vgname);
   3057      1.1  haad 
   3058      1.1  haad 		/* Move PVs onto results list */
   3059      1.1  haad 		if (pvslist)
   3060  1.1.1.3  haad 			dm_list_iterate_items(pvl, &vg->pvs) {
   3061  1.1.1.3  haad 				if (!(pvl_copy = _copy_pvl(cmd->mem, pvl))) {
   3062  1.1.1.3  haad 					log_error("PV list allocation failed");
   3063  1.1.1.3  haad 					vg_release(vg);
   3064  1.1.1.3  haad 					return 0;
   3065  1.1.1.3  haad 				}
   3066  1.1.1.3  haad 				dm_list_add(results, &pvl_copy->list);
   3067  1.1.1.3  haad 			}
   3068  1.1.1.3  haad 		vg_release(vg);
   3069      1.1  haad 	}
   3070      1.1  haad 	init_pvmove(old_pvmove);
   3071      1.1  haad 
   3072      1.1  haad 	if (pvslist)
   3073      1.1  haad 		*pvslist = results;
   3074      1.1  haad 	else
   3075      1.1  haad 		dm_pool_free(cmd->mem, vgids);
   3076      1.1  haad 
   3077      1.1  haad 	return 1;
   3078      1.1  haad }
   3079      1.1  haad 
   3080      1.1  haad struct dm_list *get_pvs(struct cmd_context *cmd)
   3081      1.1  haad {
   3082      1.1  haad 	struct dm_list *results;
   3083      1.1  haad 
   3084      1.1  haad 	if (!_get_pvs(cmd, &results))
   3085      1.1  haad 		return NULL;
   3086      1.1  haad 
   3087      1.1  haad 	return results;
   3088      1.1  haad }
   3089      1.1  haad 
   3090      1.1  haad int scan_vgs_for_pvs(struct cmd_context *cmd)
   3091      1.1  haad {
   3092      1.1  haad 	return _get_pvs(cmd, NULL);
   3093      1.1  haad }
   3094      1.1  haad 
   3095      1.1  haad int pv_write(struct cmd_context *cmd __attribute((unused)),
   3096      1.1  haad 	     struct physical_volume *pv,
   3097      1.1  haad 	     struct dm_list *mdas, int64_t label_sector)
   3098      1.1  haad {
   3099      1.1  haad 	if (!pv->fmt->ops->pv_write) {
   3100      1.1  haad 		log_error("Format does not support writing physical volumes");
   3101      1.1  haad 		return 0;
   3102      1.1  haad 	}
   3103      1.1  haad 
   3104      1.1  haad 	if (!is_orphan_vg(pv->vg_name) || pv->pe_alloc_count) {
   3105      1.1  haad 		log_error("Assertion failed: can't _pv_write non-orphan PV "
   3106      1.1  haad 			  "(in VG %s)", pv->vg_name);
   3107      1.1  haad 		return 0;
   3108      1.1  haad 	}
   3109      1.1  haad 
   3110      1.1  haad 	if (!pv->fmt->ops->pv_write(pv->fmt, pv, mdas, label_sector))
   3111      1.1  haad 		return_0;
   3112      1.1  haad 
   3113      1.1  haad 	return 1;
   3114      1.1  haad }
   3115      1.1  haad 
   3116      1.1  haad int pv_write_orphan(struct cmd_context *cmd, struct physical_volume *pv)
   3117      1.1  haad {
   3118      1.1  haad 	const char *old_vg_name = pv->vg_name;
   3119      1.1  haad 
   3120      1.1  haad 	pv->vg_name = cmd->fmt->orphan_vg_name;
   3121      1.1  haad 	pv->status = ALLOCATABLE_PV;
   3122      1.1  haad 	pv->pe_alloc_count = 0;
   3123      1.1  haad 
   3124      1.1  haad 	if (!dev_get_size(pv->dev, &pv->size)) {
   3125      1.1  haad 		log_error("%s: Couldn't get size.", pv_dev_name(pv));
   3126      1.1  haad 		return 0;
   3127      1.1  haad 	}
   3128      1.1  haad 
   3129  1.1.1.3  haad 	if (!pv_write(cmd, pv, NULL, INT64_C(-1))) {
   3130      1.1  haad 		log_error("Failed to clear metadata from physical "
   3131      1.1  haad 			  "volume \"%s\" after removal from \"%s\"",
   3132      1.1  haad 			  pv_dev_name(pv), old_vg_name);
   3133      1.1  haad 		return 0;
   3134      1.1  haad 	}
   3135      1.1  haad 
   3136      1.1  haad 	return 1;
   3137      1.1  haad }
   3138      1.1  haad 
   3139      1.1  haad /**
   3140      1.1  haad  * is_orphan_vg - Determine whether a vg_name is an orphan
   3141      1.1  haad  * @vg_name: pointer to the vg_name
   3142      1.1  haad  */
   3143      1.1  haad int is_orphan_vg(const char *vg_name)
   3144      1.1  haad {
   3145      1.1  haad 	return (vg_name && vg_name[0] == ORPHAN_PREFIX[0]) ? 1 : 0;
   3146      1.1  haad }
   3147      1.1  haad 
   3148      1.1  haad /**
   3149      1.1  haad  * is_orphan - Determine whether a pv is an orphan based on its vg_name
   3150      1.1  haad  * @pv: handle to the physical volume
   3151      1.1  haad  */
   3152  1.1.1.3  haad int is_orphan(const struct physical_volume *pv)
   3153      1.1  haad {
   3154      1.1  haad 	return is_orphan_vg(pv_field(pv, vg_name));
   3155      1.1  haad }
   3156      1.1  haad 
   3157      1.1  haad /**
   3158      1.1  haad  * is_pv - Determine whether a pv is a real pv or dummy one
   3159      1.1  haad  * @pv: handle to device
   3160      1.1  haad  */
   3161  1.1.1.3  haad int is_pv(struct physical_volume *pv)
   3162      1.1  haad {
   3163      1.1  haad 	return (pv_field(pv, vg_name) ? 1 : 0);
   3164      1.1  haad }
   3165      1.1  haad 
   3166      1.1  haad /*
   3167      1.1  haad  * Returns:
   3168      1.1  haad  *  0 - fail
   3169      1.1  haad  *  1 - success
   3170      1.1  haad  */
   3171      1.1  haad int pv_analyze(struct cmd_context *cmd, const char *pv_name,
   3172      1.1  haad 	       uint64_t label_sector)
   3173      1.1  haad {
   3174      1.1  haad 	struct label *label;
   3175      1.1  haad 	struct device *dev;
   3176      1.1  haad 	struct metadata_area *mda;
   3177      1.1  haad 	struct lvmcache_info *info;
   3178      1.1  haad 
   3179      1.1  haad 	dev = dev_cache_get(pv_name, cmd->filter);
   3180      1.1  haad 	if (!dev) {
   3181      1.1  haad 		log_error("Device %s not found (or ignored by filtering).",
   3182      1.1  haad 			  pv_name);
   3183      1.1  haad 		return 0;
   3184      1.1  haad 	}
   3185      1.1  haad 
   3186      1.1  haad 	/*
   3187      1.1  haad 	 * First, scan for LVM labels.
   3188      1.1  haad 	 */
   3189      1.1  haad 	if (!label_read(dev, &label, label_sector)) {
   3190      1.1  haad 		log_error("Could not find LVM label on %s",
   3191      1.1  haad 			  pv_name);
   3192      1.1  haad 		return 0;
   3193      1.1  haad 	}
   3194      1.1  haad 
   3195      1.1  haad 	log_print("Found label on %s, sector %"PRIu64", type=%s",
   3196      1.1  haad 		  pv_name, label->sector, label->type);
   3197      1.1  haad 
   3198      1.1  haad 	/*
   3199      1.1  haad 	 * Next, loop through metadata areas
   3200      1.1  haad 	 */
   3201      1.1  haad 	info = label->info;
   3202      1.1  haad 	dm_list_iterate_items(mda, &info->mdas)
   3203      1.1  haad 		mda->ops->pv_analyze_mda(info->fmt, mda);
   3204      1.1  haad 
   3205      1.1  haad 	return 1;
   3206      1.1  haad }
   3207      1.1  haad 
   3208  1.1.1.3  haad /* FIXME: remove / combine this with locking? */
   3209  1.1.1.3  haad int vg_check_write_mode(struct volume_group *vg)
   3210  1.1.1.3  haad {
   3211  1.1.1.3  haad 	if (vg->open_mode != 'w') {
   3212  1.1.1.3  haad 		log_errno(EPERM, "Attempt to modify a read-only VG");
   3213  1.1.1.3  haad 		return 0;
   3214  1.1.1.3  haad 	}
   3215  1.1.1.3  haad 	return 1;
   3216  1.1.1.3  haad }
   3217      1.1  haad 
   3218  1.1.1.3  haad /*
   3219  1.1.1.3  haad  * Performs a set of checks against a VG according to bits set in status
   3220  1.1.1.3  haad  * and returns FAILED_* bits for those that aren't acceptable.
   3221      1.1  haad  *
   3222  1.1.1.3  haad  * FIXME Remove the unnecessary duplicate definitions and return bits directly.
   3223      1.1  haad  */
   3224  1.1.1.3  haad static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
   3225  1.1.1.3  haad 				    uint32_t status)
   3226      1.1  haad {
   3227  1.1.1.3  haad 	uint32_t failure = 0;
   3228  1.1.1.3  haad 
   3229      1.1  haad 	if ((status & CLUSTERED) &&
   3230  1.1.1.3  haad 	    (vg_is_clustered(vg)) && !locking_is_clustered()) {
   3231      1.1  haad 		log_error("Skipping clustered volume group %s", vg->name);
   3232  1.1.1.3  haad 		/* Return because other flags are considered undefined. */
   3233  1.1.1.3  haad 		return FAILED_CLUSTERED;
   3234      1.1  haad 	}
   3235      1.1  haad 
   3236      1.1  haad 	if ((status & EXPORTED_VG) &&
   3237  1.1.1.3  haad 	    vg_is_exported(vg)) {
   3238      1.1  haad 		log_error("Volume group %s is exported", vg->name);
   3239  1.1.1.3  haad 		failure |= FAILED_EXPORTED;
   3240      1.1  haad 	}
   3241      1.1  haad 
   3242      1.1  haad 	if ((status & LVM_WRITE) &&
   3243      1.1  haad 	    !(vg->status & LVM_WRITE)) {
   3244      1.1  haad 		log_error("Volume group %s is read-only", vg->name);
   3245  1.1.1.3  haad 		failure |= FAILED_READ_ONLY;
   3246      1.1  haad 	}
   3247  1.1.1.3  haad 
   3248      1.1  haad 	if ((status & RESIZEABLE_VG) &&
   3249  1.1.1.3  haad 	    !vg_is_resizeable(vg)) {
   3250      1.1  haad 		log_error("Volume group %s is not resizeable.", vg->name);
   3251  1.1.1.3  haad 		failure |= FAILED_RESIZEABLE;
   3252      1.1  haad 	}
   3253      1.1  haad 
   3254  1.1.1.3  haad 	return failure;
   3255      1.1  haad }
   3256      1.1  haad 
   3257  1.1.1.3  haad /**
   3258  1.1.1.3  haad  * vg_check_status - check volume group status flags and log error
   3259  1.1.1.3  haad  * @vg - volume group to check status flags
   3260  1.1.1.3  haad  * @status - specific status flags to check (e.g. EXPORTED_VG)
   3261      1.1  haad  */
   3262  1.1.1.3  haad int vg_check_status(const struct volume_group *vg, uint32_t status)
   3263  1.1.1.3  haad {
   3264  1.1.1.3  haad 	return !_vg_bad_status_bits(vg, status);
   3265  1.1.1.3  haad }
   3266  1.1.1.3  haad 
   3267  1.1.1.3  haad static struct volume_group *_recover_vg(struct cmd_context *cmd, const char *lock_name,
   3268  1.1.1.3  haad 			 const char *vg_name, const char *vgid,
   3269  1.1.1.3  haad 			 uint32_t lock_flags)
   3270      1.1  haad {
   3271      1.1  haad 	int consistent = 1;
   3272  1.1.1.3  haad 	struct volume_group *vg;
   3273  1.1.1.3  haad 
   3274  1.1.1.3  haad 	lock_flags &= ~LCK_TYPE_MASK;
   3275  1.1.1.3  haad 	lock_flags |= LCK_WRITE;
   3276  1.1.1.3  haad 
   3277  1.1.1.3  haad 	unlock_vg(cmd, lock_name);
   3278  1.1.1.3  haad 
   3279  1.1.1.3  haad 	dev_close_all();
   3280  1.1.1.3  haad 
   3281  1.1.1.3  haad 	if (!lock_vol(cmd, lock_name, lock_flags))
   3282  1.1.1.3  haad 		return_NULL;
   3283  1.1.1.3  haad 
   3284  1.1.1.3  haad 	if (!(vg = vg_read_internal(cmd, vg_name, vgid, &consistent)))
   3285  1.1.1.3  haad 		return_NULL;
   3286  1.1.1.3  haad 
   3287  1.1.1.3  haad 	if (!consistent) {
   3288  1.1.1.3  haad 		vg_release(vg);
   3289  1.1.1.3  haad 		return_NULL;
   3290  1.1.1.3  haad 	}
   3291  1.1.1.3  haad 
   3292  1.1.1.3  haad 	return (struct volume_group *)vg;
   3293  1.1.1.3  haad }
   3294      1.1  haad 
   3295  1.1.1.3  haad /*
   3296  1.1.1.3  haad  * Consolidated locking, reading, and status flag checking.
   3297  1.1.1.3  haad  *
   3298  1.1.1.3  haad  * If the metadata is inconsistent, setting READ_ALLOW_INCONSISTENT in
   3299  1.1.1.3  haad  * misc_flags will return it with FAILED_INCONSISTENT set instead of
   3300  1.1.1.3  haad  * giving you nothing.
   3301  1.1.1.3  haad  *
   3302  1.1.1.3  haad  * Use vg_read_error(vg) to determine the result.  Nonzero means there were
   3303  1.1.1.3  haad  * problems reading the volume group.
   3304  1.1.1.3  haad  * Zero value means that the VG is open and appropriate locks are held.
   3305  1.1.1.3  haad  */
   3306  1.1.1.3  haad static struct volume_group *_vg_lock_and_read(struct cmd_context *cmd, const char *vg_name,
   3307  1.1.1.3  haad 			       const char *vgid, uint32_t lock_flags,
   3308  1.1.1.3  haad 			       uint32_t status_flags, uint32_t misc_flags)
   3309  1.1.1.3  haad {
   3310  1.1.1.3  haad 	struct volume_group *vg = NULL;
   3311  1.1.1.3  haad 	const char *lock_name;
   3312  1.1.1.3  haad  	int consistent = 1;
   3313  1.1.1.3  haad 	int consistent_in;
   3314  1.1.1.3  haad 	uint32_t failure = 0;
   3315  1.1.1.3  haad 	int already_locked;
   3316  1.1.1.3  haad 
   3317  1.1.1.3  haad 	if (misc_flags & READ_ALLOW_INCONSISTENT || !(lock_flags & LCK_WRITE))
   3318      1.1  haad 		consistent = 0;
   3319      1.1  haad 
   3320  1.1.1.3  haad 	if (!validate_name(vg_name) && !is_orphan_vg(vg_name)) {
   3321      1.1  haad 		log_error("Volume group name %s has invalid characters",
   3322      1.1  haad 			  vg_name);
   3323      1.1  haad 		return NULL;
   3324      1.1  haad 	}
   3325      1.1  haad 
   3326  1.1.1.3  haad 	lock_name = is_orphan_vg(vg_name) ? VG_ORPHANS : vg_name;
   3327  1.1.1.3  haad 	already_locked = vgname_is_locked(lock_name);
   3328  1.1.1.3  haad 
   3329  1.1.1.3  haad 	if (!already_locked && !(misc_flags & READ_WITHOUT_LOCK) &&
   3330  1.1.1.3  haad 	    !lock_vol(cmd, lock_name, lock_flags)) {
   3331      1.1  haad 		log_error("Can't get lock for %s", vg_name);
   3332  1.1.1.3  haad 		return _vg_make_handle(cmd, vg, FAILED_LOCKING);
   3333      1.1  haad 	}
   3334      1.1  haad 
   3335  1.1.1.3  haad 	if (is_orphan_vg(vg_name))
   3336  1.1.1.3  haad 		status_flags &= ~LVM_WRITE;
   3337  1.1.1.3  haad 
   3338  1.1.1.3  haad 	consistent_in = consistent;
   3339  1.1.1.3  haad 
   3340  1.1.1.3  haad 	/* If consistent == 1, we get NULL here if correction fails. */
   3341  1.1.1.3  haad 	if (!(vg = vg_read_internal(cmd, vg_name, vgid, &consistent))) {
   3342  1.1.1.3  haad 		if (consistent_in && !consistent) {
   3343  1.1.1.3  haad 			log_error("Volume group \"%s\" inconsistent.", vg_name);
   3344  1.1.1.3  haad 			failure |= FAILED_INCONSISTENT;
   3345  1.1.1.3  haad 			goto_bad;
   3346  1.1.1.3  haad 		}
   3347  1.1.1.3  haad 
   3348      1.1  haad 		log_error("Volume group \"%s\" not found", vg_name);
   3349  1.1.1.3  haad 
   3350  1.1.1.3  haad 		failure |= FAILED_NOTFOUND;
   3351  1.1.1.3  haad 		goto_bad;
   3352      1.1  haad 	}
   3353      1.1  haad 
   3354  1.1.1.3  haad 	if (vg_is_clustered(vg) && !locking_is_clustered()) {
   3355  1.1.1.3  haad 		log_error("Skipping clustered volume group %s", vg->name);
   3356  1.1.1.3  haad 		failure |= FAILED_CLUSTERED;
   3357  1.1.1.3  haad 		goto_bad;
   3358      1.1  haad 	}
   3359      1.1  haad 
   3360  1.1.1.3  haad 	/* consistent == 0 when VG is not found, but failed == FAILED_NOTFOUND */
   3361  1.1.1.3  haad 	if (!consistent && !failure) {
   3362  1.1.1.3  haad 		vg_release(vg);
   3363  1.1.1.3  haad 		if (!(vg = _recover_vg(cmd, lock_name, vg_name, vgid, lock_flags))) {
   3364  1.1.1.3  haad 			log_error("Recovery of volume group \"%s\" failed.",
   3365  1.1.1.3  haad 				  vg_name);
   3366  1.1.1.3  haad 			failure |= FAILED_INCONSISTENT;
   3367  1.1.1.3  haad 			goto_bad;
   3368  1.1.1.3  haad 		}
   3369  1.1.1.3  haad 	}
   3370  1.1.1.3  haad 
   3371  1.1.1.3  haad 	/*
   3372  1.1.1.3  haad 	 * Check that the tool can handle tricky cases -- missing PVs and
   3373  1.1.1.3  haad 	 * unknown segment types.
   3374  1.1.1.3  haad 	 */
   3375  1.1.1.3  haad 
   3376  1.1.1.3  haad 	if (!cmd->handles_missing_pvs && vg_missing_pv_count(vg) &&
   3377  1.1.1.3  haad 	    (lock_flags & LCK_WRITE)) {
   3378  1.1.1.3  haad 		log_error("Cannot change VG %s while PVs are missing.", vg->name);
   3379  1.1.1.3  haad 		log_error("Consider vgreduce --removemissing.");
   3380  1.1.1.3  haad 		failure |= FAILED_INCONSISTENT; /* FIXME new failure code here? */
   3381  1.1.1.3  haad 		goto_bad;
   3382  1.1.1.3  haad 	}
   3383  1.1.1.3  haad 
   3384  1.1.1.3  haad 	if (!cmd->handles_unknown_segments && vg_has_unknown_segments(vg) &&
   3385  1.1.1.3  haad 	    (lock_flags & LCK_WRITE)) {
   3386  1.1.1.3  haad 		log_error("Cannot change VG %s with unknown segments in it!",
   3387  1.1.1.3  haad 			  vg->name);
   3388  1.1.1.3  haad 		failure |= FAILED_INCONSISTENT; /* FIXME new failure code here? */
   3389  1.1.1.3  haad 		goto_bad;
   3390  1.1.1.3  haad 	}
   3391  1.1.1.3  haad 
   3392  1.1.1.3  haad 	failure |= _vg_bad_status_bits(vg, status_flags);
   3393  1.1.1.3  haad 	if (failure)
   3394  1.1.1.3  haad 		goto_bad;
   3395  1.1.1.3  haad 
   3396  1.1.1.3  haad 	return _vg_make_handle(cmd, vg, failure);
   3397  1.1.1.3  haad 
   3398  1.1.1.3  haad bad:
   3399  1.1.1.3  haad 	if (!already_locked && !(misc_flags & READ_WITHOUT_LOCK))
   3400  1.1.1.3  haad 		unlock_vg(cmd, lock_name);
   3401  1.1.1.3  haad 
   3402  1.1.1.3  haad 	return _vg_make_handle(cmd, vg, failure);
   3403  1.1.1.3  haad }
   3404  1.1.1.3  haad 
   3405  1.1.1.3  haad /*
   3406  1.1.1.3  haad  * vg_read: High-level volume group metadata read function.
   3407  1.1.1.3  haad  *
   3408  1.1.1.3  haad  * vg_read_error() must be used on any handle returned to check for errors.
   3409  1.1.1.3  haad  *
   3410  1.1.1.3  haad  *  - metadata inconsistent and automatic correction failed: FAILED_INCONSISTENT
   3411  1.1.1.3  haad  *  - VG is read-only: FAILED_READ_ONLY
   3412  1.1.1.3  haad  *  - VG is EXPORTED, unless flags has READ_ALLOW_EXPORTED: FAILED_EXPORTED
   3413  1.1.1.3  haad  *  - VG is not RESIZEABLE: FAILED_RESIZEABLE
   3414  1.1.1.3  haad  *  - locking failed: FAILED_LOCKING
   3415  1.1.1.3  haad  *
   3416  1.1.1.3  haad  * On failures, all locks are released, unless one of the following applies:
   3417  1.1.1.3  haad  *  - vgname_is_locked(lock_name) is true
   3418  1.1.1.3  haad  * FIXME: remove the above 2 conditions if possible and make an error always
   3419  1.1.1.3  haad  * release the lock.
   3420  1.1.1.3  haad  *
   3421  1.1.1.3  haad  * Volume groups are opened read-only unless flags contains READ_FOR_UPDATE.
   3422  1.1.1.3  haad  *
   3423  1.1.1.3  haad  * Checking for VG existence:
   3424  1.1.1.3  haad  *
   3425  1.1.1.3  haad  * FIXME: We want vg_read to attempt automatic recovery after acquiring a
   3426  1.1.1.3  haad  * temporary write lock: if that fails, we bail out as usual, with failed &
   3427  1.1.1.3  haad  * FAILED_INCONSISTENT. If it works, we are good to go. Code that's been in
   3428  1.1.1.3  haad  * toollib just set lock_flags to LCK_VG_WRITE and called vg_read_internal with
   3429  1.1.1.3  haad  * *consistent = 1.
   3430  1.1.1.3  haad  */
   3431  1.1.1.3  haad struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name,
   3432  1.1.1.3  haad 	      const char *vgid, uint32_t flags)
   3433  1.1.1.3  haad {
   3434  1.1.1.3  haad 	uint32_t status = 0;
   3435  1.1.1.3  haad 	uint32_t lock_flags = LCK_VG_READ;
   3436  1.1.1.3  haad 
   3437  1.1.1.3  haad 	if (flags & READ_FOR_UPDATE) {
   3438  1.1.1.3  haad 		status |= EXPORTED_VG | LVM_WRITE;
   3439  1.1.1.3  haad 		lock_flags = LCK_VG_WRITE;
   3440  1.1.1.3  haad 	}
   3441  1.1.1.3  haad 
   3442  1.1.1.3  haad 	if (flags & READ_ALLOW_EXPORTED)
   3443  1.1.1.3  haad 		status &= ~EXPORTED_VG;
   3444  1.1.1.3  haad 
   3445  1.1.1.3  haad 	return _vg_lock_and_read(cmd, vg_name, vgid, lock_flags, status, flags);
   3446  1.1.1.3  haad }
   3447  1.1.1.3  haad 
   3448  1.1.1.3  haad /*
   3449  1.1.1.3  haad  * A high-level volume group metadata reading function. Open a volume group for
   3450  1.1.1.3  haad  * later update (this means the user code can change the metadata and later
   3451  1.1.1.3  haad  * request the new metadata to be written and committed).
   3452  1.1.1.3  haad  */
   3453  1.1.1.3  haad struct volume_group *vg_read_for_update(struct cmd_context *cmd, const char *vg_name,
   3454  1.1.1.3  haad 			 const char *vgid, uint32_t flags)
   3455  1.1.1.3  haad {
   3456  1.1.1.3  haad 	return vg_read(cmd, vg_name, vgid, flags | READ_FOR_UPDATE);
   3457  1.1.1.3  haad }
   3458  1.1.1.3  haad 
   3459  1.1.1.3  haad /*
   3460  1.1.1.3  haad  * Test the validity of a VG handle returned by vg_read() or vg_read_for_update().
   3461  1.1.1.3  haad  */
   3462  1.1.1.3  haad uint32_t vg_read_error(struct volume_group *vg_handle)
   3463  1.1.1.3  haad {
   3464  1.1.1.3  haad 	if (!vg_handle)
   3465  1.1.1.3  haad 		return FAILED_ALLOCATION;
   3466  1.1.1.3  haad 
   3467  1.1.1.3  haad 	return vg_handle->read_status;
   3468  1.1.1.3  haad }
   3469  1.1.1.3  haad 
   3470  1.1.1.3  haad /*
   3471  1.1.1.3  haad  * Lock a vgname and/or check for existence.
   3472  1.1.1.3  haad  * Takes a WRITE lock on the vgname before scanning.
   3473  1.1.1.3  haad  * If scanning fails or vgname found, release the lock.
   3474  1.1.1.3  haad  * NOTE: If you find the return codes confusing, you might think of this
   3475  1.1.1.3  haad  * function as similar to an open() call with O_CREAT and O_EXCL flags
   3476  1.1.1.3  haad  * (open returns fail with -EEXIST if file already exists).
   3477  1.1.1.3  haad  *
   3478  1.1.1.3  haad  * Returns:
   3479  1.1.1.3  haad  * FAILED_LOCKING - Cannot lock name
   3480  1.1.1.3  haad  * FAILED_EXIST - VG name already exists - cannot reserve
   3481  1.1.1.3  haad  * SUCCESS - VG name does not exist in system and WRITE lock held
   3482  1.1.1.3  haad  */
   3483  1.1.1.3  haad uint32_t vg_lock_newname(struct cmd_context *cmd, const char *vgname)
   3484  1.1.1.3  haad {
   3485  1.1.1.3  haad 	if (!lock_vol(cmd, vgname, LCK_VG_WRITE)) {
   3486  1.1.1.3  haad 		return FAILED_LOCKING;
   3487  1.1.1.3  haad 	}
   3488  1.1.1.3  haad 
   3489  1.1.1.3  haad 	/* Find the vgname in the cache */
   3490  1.1.1.3  haad 	/* If it's not there we must do full scan to be completely sure */
   3491  1.1.1.3  haad 	if (!fmt_from_vgname(vgname, NULL)) {
   3492  1.1.1.3  haad 		lvmcache_label_scan(cmd, 0);
   3493  1.1.1.3  haad 		if (!fmt_from_vgname(vgname, NULL)) {
   3494  1.1.1.3  haad 			if (memlock()) {
   3495  1.1.1.3  haad 				/*
   3496  1.1.1.3  haad 				 * FIXME: Disallow calling this function if
   3497  1.1.1.3  haad 				 * memlock() is true.
   3498  1.1.1.3  haad 				 */
   3499  1.1.1.3  haad 				unlock_vg(cmd, vgname);
   3500  1.1.1.3  haad 				return FAILED_LOCKING;
   3501  1.1.1.3  haad 			}
   3502  1.1.1.3  haad 			lvmcache_label_scan(cmd, 2);
   3503  1.1.1.3  haad 			if (!fmt_from_vgname(vgname, NULL)) {
   3504  1.1.1.3  haad 				/* vgname not found after scanning */
   3505  1.1.1.3  haad 				return SUCCESS;
   3506  1.1.1.3  haad 			}
   3507  1.1.1.3  haad 		}
   3508  1.1.1.3  haad 	}
   3509  1.1.1.3  haad 
   3510  1.1.1.3  haad 	/* Found vgname so cannot reserve. */
   3511  1.1.1.3  haad 	unlock_vg(cmd, vgname);
   3512  1.1.1.3  haad 	return FAILED_EXIST;
   3513      1.1  haad }
   3514      1.1  haad 
   3515      1.1  haad /*
   3516      1.1  haad  * Gets/Sets for external LVM library
   3517      1.1  haad  */
   3518  1.1.1.3  haad struct id pv_id(const struct physical_volume *pv)
   3519      1.1  haad {
   3520      1.1  haad 	return pv_field(pv, id);
   3521      1.1  haad }
   3522      1.1  haad 
   3523  1.1.1.3  haad const struct format_type *pv_format_type(const struct physical_volume *pv)
   3524      1.1  haad {
   3525      1.1  haad 	return pv_field(pv, fmt);
   3526      1.1  haad }
   3527      1.1  haad 
   3528  1.1.1.3  haad struct id pv_vgid(const struct physical_volume *pv)
   3529      1.1  haad {
   3530      1.1  haad 	return pv_field(pv, vgid);
   3531      1.1  haad }
   3532      1.1  haad 
   3533  1.1.1.3  haad struct device *pv_dev(const struct physical_volume *pv)
   3534      1.1  haad {
   3535      1.1  haad 	return pv_field(pv, dev);
   3536      1.1  haad }
   3537      1.1  haad 
   3538  1.1.1.3  haad const char *pv_vg_name(const struct physical_volume *pv)
   3539      1.1  haad {
   3540      1.1  haad 	return pv_field(pv, vg_name);
   3541      1.1  haad }
   3542      1.1  haad 
   3543  1.1.1.3  haad const char *pv_dev_name(const struct physical_volume *pv)
   3544      1.1  haad {
   3545      1.1  haad 	return dev_name(pv_dev(pv));
   3546      1.1  haad }
   3547      1.1  haad 
   3548  1.1.1.3  haad uint64_t pv_size(const struct physical_volume *pv)
   3549      1.1  haad {
   3550      1.1  haad 	return pv_field(pv, size);
   3551      1.1  haad }
   3552      1.1  haad 
   3553  1.1.1.3  haad uint32_t pv_status(const struct physical_volume *pv)
   3554      1.1  haad {
   3555      1.1  haad 	return pv_field(pv, status);
   3556      1.1  haad }
   3557      1.1  haad 
   3558  1.1.1.3  haad uint32_t pv_pe_size(const struct physical_volume *pv)
   3559      1.1  haad {
   3560      1.1  haad 	return pv_field(pv, pe_size);
   3561      1.1  haad }
   3562      1.1  haad 
   3563  1.1.1.3  haad uint64_t pv_pe_start(const struct physical_volume *pv)
   3564      1.1  haad {
   3565      1.1  haad 	return pv_field(pv, pe_start);
   3566      1.1  haad }
   3567      1.1  haad 
   3568  1.1.1.3  haad uint32_t pv_pe_count(const struct physical_volume *pv)
   3569      1.1  haad {
   3570      1.1  haad 	return pv_field(pv, pe_count);
   3571      1.1  haad }
   3572      1.1  haad 
   3573  1.1.1.3  haad uint32_t pv_pe_alloc_count(const struct physical_volume *pv)
   3574      1.1  haad {
   3575      1.1  haad 	return pv_field(pv, pe_alloc_count);
   3576      1.1  haad }
   3577      1.1  haad 
   3578  1.1.1.3  haad uint32_t pv_mda_count(const struct physical_volume *pv)
   3579  1.1.1.3  haad {
   3580  1.1.1.3  haad 	struct lvmcache_info *info;
   3581  1.1.1.3  haad 
   3582  1.1.1.3  haad 	info = info_from_pvid((const char *)&pv->id.uuid, 0);
   3583  1.1.1.3  haad 	return info ? dm_list_size(&info->mdas) : UINT64_C(0);
   3584  1.1.1.3  haad }
   3585  1.1.1.3  haad 
   3586  1.1.1.3  haad uint32_t vg_seqno(const struct volume_group *vg)
   3587  1.1.1.3  haad {
   3588  1.1.1.3  haad 	return vg->seqno;
   3589  1.1.1.3  haad }
   3590  1.1.1.3  haad 
   3591  1.1.1.3  haad uint32_t vg_status(const struct volume_group *vg)
   3592      1.1  haad {
   3593      1.1  haad 	return vg->status;
   3594      1.1  haad }
   3595      1.1  haad 
   3596  1.1.1.3  haad uint64_t vg_size(const struct volume_group *vg)
   3597  1.1.1.3  haad {
   3598  1.1.1.3  haad 	return (uint64_t) vg->extent_count * vg->extent_size;
   3599  1.1.1.3  haad }
   3600  1.1.1.3  haad 
   3601  1.1.1.3  haad uint64_t vg_free(const struct volume_group *vg)
   3602  1.1.1.3  haad {
   3603  1.1.1.3  haad 	return (uint64_t) vg->free_count * vg->extent_size;
   3604  1.1.1.3  haad }
   3605  1.1.1.3  haad 
   3606  1.1.1.3  haad uint64_t vg_extent_size(const struct volume_group *vg)
   3607  1.1.1.3  haad {
   3608  1.1.1.3  haad 	return (uint64_t) vg->extent_size;
   3609  1.1.1.3  haad }
   3610  1.1.1.3  haad 
   3611  1.1.1.3  haad uint64_t vg_extent_count(const struct volume_group *vg)
   3612  1.1.1.3  haad {
   3613  1.1.1.3  haad 	return (uint64_t) vg->extent_count;
   3614  1.1.1.3  haad }
   3615  1.1.1.3  haad 
   3616  1.1.1.3  haad uint64_t vg_free_count(const struct volume_group *vg)
   3617  1.1.1.3  haad {
   3618  1.1.1.3  haad 	return (uint64_t) vg->free_count;
   3619  1.1.1.3  haad }
   3620  1.1.1.3  haad 
   3621  1.1.1.3  haad uint64_t vg_pv_count(const struct volume_group *vg)
   3622  1.1.1.3  haad {
   3623  1.1.1.3  haad 	return (uint64_t) vg->pv_count;
   3624  1.1.1.3  haad }
   3625  1.1.1.3  haad 
   3626  1.1.1.3  haad uint64_t vg_max_pv(const struct volume_group *vg)
   3627  1.1.1.3  haad {
   3628  1.1.1.3  haad 	return (uint64_t) vg->max_pv;
   3629  1.1.1.3  haad }
   3630  1.1.1.3  haad 
   3631  1.1.1.3  haad uint64_t vg_max_lv(const struct volume_group *vg)
   3632  1.1.1.3  haad {
   3633  1.1.1.3  haad 	return (uint64_t) vg->max_lv;
   3634  1.1.1.3  haad }
   3635  1.1.1.3  haad 
   3636  1.1.1.3  haad uint32_t vg_mda_count(const struct volume_group *vg)
   3637  1.1.1.3  haad {
   3638  1.1.1.3  haad 	return dm_list_size(&vg->fid->metadata_areas);
   3639  1.1.1.3  haad }
   3640  1.1.1.3  haad 
   3641  1.1.1.3  haad uint64_t lv_size(const struct logical_volume *lv)
   3642  1.1.1.3  haad {
   3643  1.1.1.3  haad 	return lv->size;
   3644  1.1.1.3  haad }
   3645  1.1.1.3  haad 
   3646      1.1  haad /**
   3647      1.1  haad  * pv_by_path - Given a device path return a PV handle if it is a PV
   3648      1.1  haad  * @cmd - handle to the LVM command instance
   3649      1.1  haad  * @pv_name - device path to read for the PV
   3650      1.1  haad  *
   3651      1.1  haad  * Returns:
   3652      1.1  haad  *  NULL - device path does not contain a valid PV
   3653      1.1  haad  *  non-NULL - PV handle corresponding to device path
   3654      1.1  haad  *
   3655      1.1  haad  * FIXME: merge with find_pv_by_name ?
   3656      1.1  haad  */
   3657  1.1.1.3  haad struct physical_volume *pv_by_path(struct cmd_context *cmd, const char *pv_name)
   3658      1.1  haad {
   3659      1.1  haad 	struct dm_list mdas;
   3660  1.1.1.3  haad 
   3661      1.1  haad 	dm_list_init(&mdas);
   3662  1.1.1.3  haad 	return _pv_read(cmd, cmd->mem, pv_name, &mdas, NULL, 1, 0);
   3663      1.1  haad }
   3664