Home | History | Annotate | Line # | Download | only in include
metadata.h revision 1.1.1.1
      1 /*	$NetBSD: metadata.h,v 1.1.1.1 2008/12/22 00:18:46 haad Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
      5  * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
      6  *
      7  * This file is part of LVM2.
      8  *
      9  * This copyrighted material is made available to anyone wishing to use,
     10  * modify, copy, or redistribute it subject to the terms and conditions
     11  * of the GNU Lesser General Public License v.2.1.
     12  *
     13  * You should have received a copy of the GNU Lesser General Public License
     14  * along with this program; if not, write to the Free Software Foundation,
     15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     16  */
     17 
     18 /*
     19  * This is the in core representation of a volume group and its
     20  * associated physical and logical volumes.
     21  */
     22 
     23 #ifndef _LVM_METADATA_H
     24 #define _LVM_METADATA_H
     25 
     26 #include "ctype.h"
     27 #include "dev-cache.h"
     28 #include "lvm-string.h"
     29 #include "metadata-exported.h"
     30 
     31 //#define MAX_STRIPES 128U
     32 //#define SECTOR_SHIFT 9L
     33 #define SECTOR_SIZE ( 1L << SECTOR_SHIFT )
     34 //#define STRIPE_SIZE_MIN ( (unsigned) lvm_getpagesize() >> SECTOR_SHIFT)	/* PAGESIZE in sectors */
     35 //#define STRIPE_SIZE_MAX ( 512L * 1024L >> SECTOR_SHIFT)	/* 512 KB in sectors */
     36 //#define STRIPE_SIZE_LIMIT ((UINT_MAX >> 2) + 1)
     37 //#define PV_MIN_SIZE ( 512L * 1024L >> SECTOR_SHIFT)	/* 512 KB in sectors */
     38 //#define MAX_RESTRICTED_LVS 255	/* Used by FMT_RESTRICTED_LVIDS */
     39 #define MIRROR_LOG_SIZE 1	/* Extents */
     40 
     41 /* Various flags */
     42 /* Note that the bits no longer necessarily correspond to LVM1 disk format */
     43 
     44 //#define PARTIAL_VG		0x00000001U	/* VG */
     45 //#define EXPORTED_VG          	0x00000002U	/* VG PV */
     46 //#define RESIZEABLE_VG        	0x00000004U	/* VG */
     47 
     48 /* May any free extents on this PV be used or must they be left free? */
     49 //#define ALLOCATABLE_PV         	0x00000008U	/* PV */
     50 
     51 #define SPINDOWN_LV          	0x00000010U	/* LV */
     52 #define BADBLOCK_ON       	0x00000020U	/* LV */
     53 //#define VISIBLE_LV		0x00000040U	/* LV */
     54 //#define FIXED_MINOR		0x00000080U	/* LV */
     55 /* FIXME Remove when metadata restructuring is completed */
     56 //#define SNAPSHOT		0x00001000U	/* LV - internal use only */
     57 //#define PVMOVE			0x00002000U	/* VG LV SEG */
     58 //#define LOCKED			0x00004000U	/* LV */
     59 //#define MIRRORED		0x00008000U	/* LV - internal use only */
     60 #define VIRTUAL			0x00010000U	/* LV - internal use only */
     61 //#define MIRROR_LOG		0x00020000U	/* LV */
     62 //#define MIRROR_IMAGE		0x00040000U	/* LV */
     63 //#define MIRROR_NOTSYNCED	0x00080000U	/* LV */
     64 #define ACTIVATE_EXCL		0x00100000U	/* LV - internal use only */
     65 #define PRECOMMITTED		0x00200000U	/* VG - internal use only */
     66 //#define CONVERTING		0x00400000U	/* LV */
     67 
     68 //#define MISSING_PV		0x00800000U	/* PV */
     69 //#define PARTIAL_LV		0x01000000U	/* LV - derived flag, not
     70 //						   written out in metadata*/
     71 
     72 #define POSTORDER_FLAG		0x02000000U /* Not real flags, reserved for  */
     73 #define POSTORDER_OPEN_FLAG	0x04000000U /* temporary use inside vg_read. */
     74 
     75 //#define LVM_READ              	0x00000100U	/* LV VG */
     76 //#define LVM_WRITE             	0x00000200U	/* LV VG */
     77 //#define CLUSTERED         	0x00000400U	/* VG */
     78 #define SHARED            	0x00000800U	/* VG */
     79 
     80 /* Format features flags */
     81 //#define FMT_SEGMENTS		0x00000001U	/* Arbitrary segment params? */
     82 //#define FMT_MDAS		0x00000002U	/* Proper metadata areas? */
     83 //#define FMT_TAGS		0x00000004U	/* Tagging? */
     84 //#define FMT_UNLIMITED_VOLS	0x00000008U	/* Unlimited PVs/LVs? */
     85 //#define FMT_RESTRICTED_LVIDS	0x00000010U	/* LVID <= 255 */
     86 //#define FMT_ORPHAN_ALLOCATABLE	0x00000020U	/* Orphan PV allocatable? */
     87 #define FMT_PRECOMMIT		0x00000040U	/* Supports pre-commit? */
     88 //#define FMT_RESIZE_PV		0x00000080U	/* Supports pvresize? */
     89 //#define FMT_UNLIMITED_STRIPESIZE 0x00000100U	/* Unlimited stripe size? */
     90 
     91 struct metadata_area;
     92 
     93 /* Per-format per-metadata area operations */
     94 struct metadata_area_ops {
     95 	struct volume_group *(*vg_read) (struct format_instance * fi,
     96 					 const char *vg_name,
     97 					 struct metadata_area * mda);
     98 	struct volume_group *(*vg_read_precommit) (struct format_instance * fi,
     99 					 const char *vg_name,
    100 					 struct metadata_area * mda);
    101 	/*
    102 	 * Write out complete VG metadata.  You must ensure internal
    103 	 * consistency before calling. eg. PEs can't refer to PVs not
    104 	 * part of the VG.
    105 	 *
    106 	 * It is also the responsibility of the caller to ensure external
    107 	 * consistency, eg by calling pv_write() if removing PVs from
    108 	 * a VG or calling vg_write() a second time if splitting a VG
    109 	 * into two.
    110 	 *
    111 	 * vg_write() should not read or write from any PVs not included
    112 	 * in the volume_group structure it is handed.
    113 	 * (format1 currently breaks this rule.)
    114 	 */
    115 	int (*vg_write) (struct format_instance * fid, struct volume_group * vg,
    116 			 struct metadata_area * mda);
    117 	int (*vg_precommit) (struct format_instance * fid,
    118 			     struct volume_group * vg,
    119 			     struct metadata_area * mda);
    120 	int (*vg_commit) (struct format_instance * fid,
    121 			  struct volume_group * vg, struct metadata_area * mda);
    122 	int (*vg_revert) (struct format_instance * fid,
    123 			  struct volume_group * vg, struct metadata_area * mda);
    124 	int (*vg_remove) (struct format_instance * fi, struct volume_group * vg,
    125 			  struct metadata_area * mda);
    126 
    127 	/*
    128 	 * Returns number of free sectors in given metadata area.
    129 	 */
    130 	uint64_t (*mda_free_sectors) (struct metadata_area *mda);
    131 
    132 	/*
    133 	 * Check if metadata area belongs to vg
    134 	 */
    135 	int (*mda_in_vg) (struct format_instance * fi,
    136 			    struct volume_group * vg, struct metadata_area *mda);
    137 	/*
    138 	 * Analyze a metadata area on a PV.
    139 	 */
    140 	int (*pv_analyze_mda) (const struct format_type * fmt,
    141 			       struct metadata_area *mda);
    142 
    143 };
    144 
    145 struct metadata_area {
    146 	struct dm_list list;
    147 	struct metadata_area_ops *ops;
    148 	void *metadata_locn;
    149 };
    150 
    151 #define seg_pvseg(seg, s)	(seg)->areas[(s)].u.pv.pvseg
    152 #define seg_dev(seg, s)		(seg)->areas[(s)].u.pv.pvseg->pv->dev
    153 #define seg_pe(seg, s)		(seg)->areas[(s)].u.pv.pvseg->pe
    154 #define seg_le(seg, s)		(seg)->areas[(s)].u.lv.le
    155 
    156 struct name_list {
    157 	struct dm_list list;
    158 	char *name;
    159 };
    160 
    161 struct mda_list {
    162 	struct dm_list list;
    163 	struct device_area mda;
    164 };
    165 
    166 struct peg_list {
    167 	struct dm_list list;
    168 	struct pv_segment *peg;
    169 };
    170 
    171 struct seg_list {
    172 	struct dm_list list;
    173 	unsigned count;
    174 	struct lv_segment *seg;
    175 };
    176 
    177 /*
    178  * Ownership of objects passes to caller.
    179  */
    180 struct format_handler {
    181 	/*
    182 	 * Scan any metadata areas that aren't referenced in PV labels
    183 	 */
    184 	int (*scan) (const struct format_type * fmt);
    185 
    186 	/*
    187 	 * Return PV with given path.
    188 	 */
    189 	int (*pv_read) (const struct format_type * fmt, const char *pv_name,
    190 			struct physical_volume * pv, struct dm_list * mdas);
    191 
    192 	/*
    193 	 * Tweak an already filled out a pv ready for importing into a
    194 	 * vg.  eg. pe_count is format specific.
    195 	 */
    196 	int (*pv_setup) (const struct format_type * fmt,
    197 			 uint64_t pe_start, uint32_t extent_count,
    198 			 uint32_t extent_size,
    199 			 int pvmetadatacopies,
    200 			 uint64_t pvmetadatasize, struct dm_list * mdas,
    201 			 struct physical_volume * pv, struct volume_group * vg);
    202 
    203 	/*
    204 	 * Write a PV structure to disk. Fails if the PV is in a VG ie
    205 	 * pv->vg_name must be a valid orphan VG name
    206 	 */
    207 	int (*pv_write) (const struct format_type * fmt,
    208 			 struct physical_volume * pv, struct dm_list * mdas,
    209 			 int64_t label_sector);
    210 
    211 	/*
    212 	 * Tweak an already filled out a lv eg, check there
    213 	 * aren't too many extents.
    214 	 */
    215 	int (*lv_setup) (struct format_instance * fi,
    216 			 struct logical_volume * lv);
    217 
    218 	/*
    219 	 * Tweak an already filled out vg.  eg, max_pv is format
    220 	 * specific.
    221 	 */
    222 	int (*vg_setup) (struct format_instance * fi, struct volume_group * vg);
    223 
    224 	/*
    225 	 * Check whether particular segment type is supported.
    226 	 */
    227 	int (*segtype_supported) (struct format_instance *fid,
    228 				  const struct segment_type *segtype);
    229 
    230 	/*
    231 	 * Create format instance with a particular metadata area
    232 	 */
    233 	struct format_instance *(*create_instance) (const struct format_type *
    234 						    fmt, const char *vgname,
    235 						    const char *vgid,
    236 						    void *context);
    237 
    238 	/*
    239 	 * Destructor for format instance
    240 	 */
    241 	void (*destroy_instance) (struct format_instance * fid);
    242 
    243 	/*
    244 	 * Destructor for format type
    245 	 */
    246 	void (*destroy) (const struct format_type * fmt);
    247 };
    248 
    249 /*
    250  * Utility functions
    251  */
    252 unsigned long pe_align(struct physical_volume *pv);
    253 int vg_validate(struct volume_group *vg);
    254 
    255 int pv_write_orphan(struct cmd_context *cmd, struct physical_volume *pv);
    256 
    257 /* Manipulate PV structures */
    258 int pv_add(struct volume_group *vg, struct physical_volume *pv);
    259 int pv_remove(struct volume_group *vg, struct physical_volume *pv);
    260 struct physical_volume *pv_find(struct volume_group *vg, const char *pv_name);
    261 
    262 /* Find a PV within a given VG */
    263 int get_pv_from_vg_by_id(const struct format_type *fmt, const char *vg_name,
    264 			 const char *vgid, const char *pvid,
    265 			 struct physical_volume *pv);
    266 
    267 struct lv_list *find_lv_in_vg_by_lvid(struct volume_group *vg,
    268 				      const union lvid *lvid);
    269 
    270 struct lv_list *find_lv_in_lv_list(const struct dm_list *ll,
    271 				   const struct logical_volume *lv);
    272 
    273 /* Return the VG that contains a given LV (based on path given in lv_name) */
    274 /* or environment var */
    275 struct volume_group *find_vg_with_lv(const char *lv_name);
    276 
    277 /* Find LV with given lvid (used during activation) */
    278 struct logical_volume *lv_from_lvid(struct cmd_context *cmd,
    279 				    const char *lvid_s,
    280 				    unsigned precommitted);
    281 
    282 /* FIXME Merge these functions with ones above */
    283 struct physical_volume *find_pv(struct volume_group *vg, struct device *dev);
    284 
    285 struct pv_list *find_pv_in_pv_list(const struct dm_list *pl,
    286 				   const struct physical_volume *pv);
    287 
    288 /* Find LV segment containing given LE */
    289 struct lv_segment *find_seg_by_le(const struct logical_volume *lv, uint32_t le);
    290 
    291 /* Find PV segment containing given LE */
    292 struct pv_segment *find_peg_by_pe(const struct physical_volume *pv, uint32_t pe);
    293 
    294 /*
    295  * Remove a dev_dir if present.
    296  */
    297 const char *strip_dir(const char *vg_name, const char *dir);
    298 
    299 /*
    300  * Checks that an lv has no gaps or overlapping segments.
    301  * Set complete_vg to perform additional VG level checks.
    302  */
    303 int check_lv_segments(struct logical_volume *lv, int complete_vg);
    304 
    305 /*
    306  * Sometimes (eg, after an lvextend), it is possible to merge two
    307  * adjacent segments into a single segment.  This function trys
    308  * to merge as many segments as possible.
    309  */
    310 int lv_merge_segments(struct logical_volume *lv);
    311 
    312 /*
    313  * Ensure there's a segment boundary at a given LE, splitting if necessary
    314  */
    315 int lv_split_segment(struct logical_volume *lv, uint32_t le);
    316 
    317 /*
    318  * Add/remove upward link from underlying LV to the segment using it
    319  * FIXME: ridiculously long name
    320  */
    321 int add_seg_to_segs_using_this_lv(struct logical_volume *lv, struct lv_segment *seg);
    322 int remove_seg_from_segs_using_this_lv(struct logical_volume *lv, struct lv_segment *seg);
    323 struct lv_segment *get_only_segment_using_this_lv(struct logical_volume *lv);
    324 
    325 /*
    326  * For internal metadata caching.
    327  */
    328 int export_vg_to_buffer(struct volume_group *vg, char **buf);
    329 struct volume_group *import_vg_from_buffer(char *buf,
    330 					   struct format_instance *fid);
    331 
    332 /*
    333  * Mirroring functions
    334  */
    335 
    336 /*
    337  * Given mirror image or mirror log segment, find corresponding mirror segment
    338  */
    339 int fixup_imported_mirrors(struct volume_group *vg);
    340 
    341 /*
    342  * Begin skeleton for external LVM library
    343  */
    344 struct id pv_id(const pv_t *pv);
    345 const struct format_type *pv_format_type(const pv_t *pv);
    346 struct id pv_vgid(const pv_t *pv);
    347 
    348 pv_t *pv_by_path(struct cmd_context *cmd, const char *pv_name);
    349 int add_pv_to_vg(struct volume_group *vg, const char *pv_name,
    350 		 struct physical_volume *pv);
    351 
    352 #endif
    353